在列中的DataGridView中搜索值

FJP*_*ort 4 c# datagridview datagridviewcolumn winforms

我希望用户能够在DataGridView(dgv)的列中搜索数字.dgv可以保存很多记录.每条记录都有一个项目编号.所以我希望用户能够在项目编号列中搜索项目编号.我的列是:ProjectID(不可见); 图像(无headertext); 项目编号; 项目名; 公司; 联系.

这是我的代码:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchValue = textBox1.Text;
    int rowIndex = -1;

    dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        foreach (DataGridViewRow row in dgvProjects.Rows)
        {
            if (row.Cells[row.Index].Value.ToString().Equals(searchValue))
            {
                rowIndex = row.Index;
                dgvProjects.Rows[row.Index].Selected = true;
                break;
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题#1:到目前为止它做了什么:用户在TextBox1中键入项目编号.当他/她单击按钮时,代码会在行中搜索此字符串,当找到项目编号时,该行将被选中.它工作正常,但只有一次.当我想搜索其他项目编号时,没有任何反应.

问题2:我认为这可以通过仅搜索列项目名称的值以更好的方式完成.但是我该如何正确地做到这一点?

我用来搜索的代码来自这个答案

Dan*_*vić 19

为什么使用row.Cells [row.Index].您需要指定要搜索的列的索引(问题#2).例如,您需要将row.Cells [row.Index]更改为row.Cells [2],其中2是列的索引:

private void btnSearch_Click(object sender, EventArgs e)
{
    string searchValue = textBox1.Text;

    dgvProjects.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    try
    {
        foreach (DataGridViewRow row in dgvProjects.Rows)
        {
            if (row.Cells[2].Value.ToString().Equals(searchValue))
            {
                row.Selected = true;
                break;
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(exc.Message);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

为什么不DataTable先构建一个然后将其分配给DataGridViewas DataSource

DataTable table4DataSource=new DataTable();

table4DataSource.Columns.Add("col00");
table4DataSource.Columns.Add("col01");
table4DataSource.Columns.Add("col02");

...
Run Code Online (Sandbox Code Playgroud)

(手动添加行,以圆圈形式或通过DataReader数据库表中的)(分配数据源)

dtGrdViewGrid.DataSource = table4DataSource;
Run Code Online (Sandbox Code Playgroud)

然后使用:

(dtGrdViewGrid.DataSource as DataTable).DefaultView.RowFilter = "col00 = '" + textBoxSearch.Text+ "'";
dtGrdViewGrid.Refresh();
Run Code Online (Sandbox Code Playgroud)

您甚至可以将这段代码放入您的textbox_textchange事件中,过滤后的值将在您编写时显示。