如何在DataGridView中创建像excel这样的搜索?

时间:2015-05-07 06:17:55

标签: c# excel datagridview find search-engine

我使用此代码在DataGridView中搜索以查找并选择一行(无过滤器)!但是,当DataGridView在行中有重复值时,它不会获得下一行!每次点击Btn_find(查找类似于Excel),我如何进入下一行?

private void button1_Click(object sender, EventArgs e)
{
    button1.Text = "Find Next";

    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.Cells["ProductId"].Value == null)
        {
            continue;
        }
        if (row.Cells["ProductId"].Value.ToString().Trim() == textBox1.Text)
        {
            dataGridView1.CurrentCell = row.Cells["ProductId"];
            dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[row.Index].Index;
            return;
        }
    }
} 

1 个答案:

答案 0 :(得分:1)

这个想法:

  • 向该类添加一个私有字段作为索引,以记住您上次找到的行。
  • 如果更改了搜索文本,请重置此索引。 (可选)
  • 遍历所有行,从上次成功搜索后的行开始。如果上次搜索没有找到结果,请从头开始。

实现:

private int searchIndex = -1;

private void button1_Click(object sender, EventArgs e)
{
  button1.Text = "Find Next";

  for (int i = 0; i < dataGridView1.Rows.Count; i++)
  {
    searchIndex = (searchIndex + 1) % dataGridView1.Rows.Count;
    DataGridViewRow row = dataGridView1.Rows[searchIndex];

    if (row.Cells["Foo"].Value == null)
    {
      continue;
    }
    if (row.Cells["Foo"].Value.ToString().Trim() == textBox1.Text)
    {
      dataGridView1.CurrentCell = row.Cells["Foo"];
      dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[row.Index].Index;
      return;
    }
  }
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
  searchIndex = -1;
}

为什么要改变这些?

  1. for (int i = 0; i < dataGridView1.Rows.Count; i++)

    • 仍然遍历每一行。
  2. searchIndex = (searchIndex + 1) % dataGridView1.Rows.Count;

    • 从行[searchIndex + 1]开始。当我们到达最后一行时,mod(%)会将我们返回到第一行。
  3. private void textBox1_TextChanged(object sender, EventArgs e) { searchIndex = -1; }

    • 输入新的搜索条件时,从列表的开头开始。这是可选的。