如何在 DataGridView 中创建类似 excel 的搜索?
How do I create search like excel in DataGridView?
我使用此代码在 DataGridView
中搜索并找到 select 一行(无过滤器)!但是,当 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;
}
}
}
想法:
- 将私有字段添加到 class 作为索引以记住您上次找到的行。
- 如果更改了搜索文本,请重置此索引。 (可选)
- 遍历所有行,从上次成功搜索之后的行开始。如果上次搜索没有找到结果,则从头开始。
实施:
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;
}
为什么要进行这些更改?
for (int i = 0; i < dataGridView1.Rows.Count; i++)
- 仍然遍历每一行。
searchIndex = (searchIndex + 1) % dataGridView1.Rows.Count;
- 从第 [searchIndex + 1] 行开始。当我们到达最后一行时,mod (
%
) returns 我们到达第一行。
private void textBox1_TextChanged(object sender, EventArgs e)
{
searchIndex = -1;
}
- 当输入新的搜索条件时,从列表的开头开始。这是可选的。
我使用此代码在 DataGridView
中搜索并找到 select 一行(无过滤器)!但是,当 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;
}
}
}
想法:
- 将私有字段添加到 class 作为索引以记住您上次找到的行。
- 如果更改了搜索文本,请重置此索引。 (可选)
- 遍历所有行,从上次成功搜索之后的行开始。如果上次搜索没有找到结果,则从头开始。
实施:
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;
}
为什么要进行这些更改?
for (int i = 0; i < dataGridView1.Rows.Count; i++)
- 仍然遍历每一行。
searchIndex = (searchIndex + 1) % dataGridView1.Rows.Count;
- 从第 [searchIndex + 1] 行开始。当我们到达最后一行时,mod (
%
) returns 我们到达第一行。
- 从第 [searchIndex + 1] 行开始。当我们到达最后一行时,mod (
private void textBox1_TextChanged(object sender, EventArgs e) { searchIndex = -1; }
- 当输入新的搜索条件时,从列表的开头开始。这是可选的。