如何在DataGridView中创build像Excel一样的search?

我用这个代码来searchDataGridView来查找并select一行(没有filter)! 但是,当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; } } } 

Pic_Form …

这个想法:

  • 添加一个私人领域的类作为索引来记住你最后find哪一行。
  • 如果search文本已更改,请重置此索引。 (可选的)
  • 遍历所有行,从上一次成功search之后的行开始。 如果没有find结果,请从头开始。

执行:

 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; }

    • 当input新的search条件时,从列表的开始处开始。 这是可选的。