【问题标题】:Search Data in Datagridview在 Datagridview 中搜索数据
【发布时间】:2023-03-14 22:39:02
【问题描述】:

我正在尝试在我的 DataGridView 中搜索数据以仅在文本框中显示带有选定文本的行,但是当我键入它时会完全删除数据。我在 MSDN 上拿了我的代码示例:https://code.msdn.microsoft.com/windowsdesktop/Search-Data-From-Database-f2cb5d53

这是我的代码:

     private void txtbox_TextChanged(object sender, EventArgs e)
     {
        DataView DV = new DataView(datatable);
        DV.RowFilter = string.Format("Name LIKE '%{0}%'", txtbox.Text);
        dataGridView1.DataSource = DV; 
     }

之前:

之后:

任何帮助将不胜感激,谢谢。

注意:我没有使用 SQL,只使用 C#

整体:命名空间 CsvFileTest { 公共部分类Form1:表格 { 私有常量 int MaxColumns = 64; 受保护的字符串文件名; protected bool 已修改;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        InitializeGrid();
        ClearFile();
    }

    private void newToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (SaveIfModified())
            ClearFile();
    }

    private void openToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (SaveIfModified())
        {
            if (openFileDialog1.ShowDialog(this) == DialogResult.OK)
                ReadFile(openFileDialog1.FileName);
        }
    }

    private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (FileName != null)
            WriteFile(FileName);
        else
            saveAsToolStripMenuItem_Click(sender, e);
    }

    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        saveFileDialog1.FileName = FileName;
        if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
            WriteFile(saveFileDialog1.FileName);
    }

    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
        if (SaveIfModified())
            Close();
    }

    /// <summary>
    /// //////////////////////////////////////////////
    /// </summary>

    private void InitializeGrid()
    {
        for (int i = 1; i <= MaxColumns; i++)
        {
            dataGridView1.Columns.Add(
                String.Format("Column{0}", i),
                String.Format("Column {0}", i));
        }
    }

    private void ClearFile()
    {
        dataGridView1.Rows.Clear();
        FileName = null;
        Modified = false;
    }

    private bool ReadFile(string filename)
    {
        Cursor = Cursors.WaitCursor;
        try
        {
            //dataGridView1.Rows.Clear();
            List<string> columns = new List<string>();
            using (var reader = new CsvFileReader(filename))
            {
                while (reader.ReadRow(columns))
                {
                    dataGridView1.Rows.Add(columns.ToArray());
                }
            }
            FileName = filename;
            Modified = false;
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(String.Format("Error reading from {0}.\r\n\r\n{1}", filename, ex.Message));
        }
        finally
        {
            Cursor = Cursors.Default;
        }
        return false;
    }

    private bool WriteFile(string filename)
    {
        Cursor = Cursors.WaitCursor;
        try
        {
            // Like Excel, we'll get the highest column number used,
            // and then write out that many columns for every row
            int numColumns = GetMaxColumnUsed();
            using (var writer = new CsvFileWriter(filename))
            {
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (!row.IsNewRow)
                    {
                        List<string> columns = new List<string>();
                        for (int col = 0; col < numColumns; col++)
                            columns.Add((string)row.Cells[col].Value ?? String.Empty);
                        writer.WriteRow(columns);
                    }
                }
            }
            FileName = filename;
            Modified = false;
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(String.Format("Error writing to {0}.\r\n\r\n{1}", filename, ex.Message));
        }
        finally
        {
            Cursor = Cursors.Default;
        }
        return false;
    }

    // Determines the maximum column number used in the grid
    private int GetMaxColumnUsed()
    {
        int maxColumnUsed = 0;
        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (!row.IsNewRow)
            {
                for (int col = row.Cells.Count - 1; col >= 0; col--)
                {
                    if (row.Cells[col].Value != null)
                    {
                        if (maxColumnUsed < (col + 1))
                            maxColumnUsed = (col + 1);
                        continue;
                    }
                }
            }
        }
        return maxColumnUsed;
    }

    private bool SaveIfModified()
    {
        if (!Modified)
            return true;

        DialogResult result = MessageBox.Show("The current file has changed. Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel);
        if (result == DialogResult.Yes)
        {
            if (FileName != null)
            {
                return WriteFile(FileName);
            }
            else
            {
                saveFileDialog1.FileName = FileName;
                if (saveFileDialog1.ShowDialog(this) == DialogResult.OK)
                    return WriteFile(saveFileDialog1.FileName);
                return false;
            }
        }
        else if (result == DialogResult.No)
        {
            return true;
        }
        else // DialogResult.Cancel
        {
            return false;
        }
    }

    private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        Modified = true;
    }
    protected static DataView dv = null;//declared at the Class Level
    protected static DataTable dtSearch = null;
    public static DataTable dtCrossTab { get; set; }

    private void button1_Click(object sender, EventArgs e)
    {

        if (txtbox.Text.Length > 0)
        {
            dtSearch = dtCrossTab;//this is the original datatable
            dv = new DataView(dtSearch);//assigning the dtSearch to dv object
            dv.RowFilter = "NAME 4 LIKE '%" + txtbox.Text.ToUpper() + "%'";

        }
        else
        {
            dtSearch = null;
            dv = null;
        }
    }

【问题讨论】:

  • 4 在过滤器中做什么?
  • 没什么,我试着写了 Colomn 4 但它没有用,因为我没有使用 SQL 我不认为这条线会工作,但我不知道如何让它在没有 SQL 的情况下工作(我真的不能使用 SQL(LINQ))
  • 好的。你检查过滤器字符串了吗?不过,它在代码中看起来确实不错。同样的代码在这里也可以工作。列类型是字符串?应用了任何格式?

标签: c# datagridview


【解决方案1】:

当分配给 DataSource 时,您将整个数据源分配给 GridView。 我建议你有一个包含所有数据的列表或集合。我有这个例子:

IEnumerable<Product> ListProduct = from Prod in LstProducts where Prod.Description.StartsWith(txtFind.Text) select Prod;
        dataGridView1.Rows.Clear();
        foreach (var item in ListProduct)
        {
            this.dataGridView1.Rows.Add(item.Id, item.Status, item.Description, tipo.Price);
        }

并过滤您想要的列中的信息(描述)并使用您想要的过滤器(StartsWith),但为此您需要一个对象列表(LstProducts)。希望对您有所帮助。

编辑。你的代码现在看起来像

private void txtbox_TextChanged(object sender, EventArgs e)
 {
    DataView DV = new DataView(datatable);
    DV.RowFilter = string.Format("ColumnX LIKE '%{0}%'", txtbox.Text);
    dataGridView1.DataSource = DV; 
 }

其中 X 是您要过滤的列的编号。如果您想要更多控制,我建议您更改列 ID、名称、描述等的名称。

【讨论】:

  • 这是LINQ,为什么不用呢?
  • 我看到了你的错误。在这一行中 'DV.RowFilter = string.Format ("Name LIKE '%{0}%'" txtbox.Text);' 列的名称不同,但我们没有过滤器。名称更改要过滤的列的名称。
  • 我在帖子中复制了我的其余代码,该部分在底部...您到底有什么建议?
  • 您的代码如下所示: DV.RowFilter = string.Format("Name LIKE '%{0}%'", txtbox.Text);但是它们如何创建 GridView 的列,它们具有不同的名称 Column1、Column2 等。那么您应该如下所示: DV.RowFilter = string.Format ("Column1 LIKE '% {0}%'" txtbox.Text );
  • 谢谢理查德,但这是我现在得到的:警告 1 字段 'CsvFileTest.Form1.datatable' 从未分配给,并且将始终具有其默认值 null
猜你喜欢
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
相关资源
最近更新 更多