根据列和值在dataGridView中查找一行

Luk*_*kas 55 c# datagridview winforms

我有一个dataGridView有3列:SystemId,FirstName,LastName使用数据库信息绑定.我想强调某一行,我会用它来做:

dataGridView1.Rows[????].Selected = true;
Run Code Online (Sandbox Code Playgroud)

然而,行ID我不知道并且bindingsource一直在变化,因此第10行在一个实例中可能是"John Smith"但在另一个实例中甚至不存在(我有一个过滤器根据用户输入的内容过滤掉源,因此输入在"joh"中会产生名字中包含"joh"的所有行,因此我的列表可以从50个名称变为3个单击中的3个.

我想找到一种方法,我可以根据SystemId和相应的数字选择一行.我可以使用以下方法获取系统ID:

systemId = dataGridView1.Rows[dataGridView1.CurrentRow.Index].Cells["SystemId"].Value.ToString();
Run Code Online (Sandbox Code Playgroud)

现在我只需要将它应用于行选择器.类似于dataGridView1.Columns ["SystemId"] .IndexOf(systemId)但不起作用(这种方法也不存在).非常感谢任何帮助.

Hab*_*bib 139

这将为您提供值的gridview行索引:

String searchValue = "somestring";
int rowIndex = -1;
foreach(DataGridViewRow row in DataGridView1.Rows)
{
    if(row.Cells[1].Value.ToString().Equals(searchValue))
    {
        rowIndex = row.Index;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

或LINQ查询

int rowIndex = -1;

        DataGridViewRow row = dgv.Rows
            .Cast<DataGridViewRow>()
            .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue))
            .First();

        rowIndex = row.Index;
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

dataGridView1.Rows[rowIndex].Selected = true;
Run Code Online (Sandbox Code Playgroud)

  • 这节省了我很多时间,在我看来最好的方法是 linq 方法..:D (3认同)

jar*_*ler 21

以上答案仅在AllowUserToAddRows设置为时才有效false.如果该属性设置为true,那么您将获得NullReferenceException循环或Linq查询尝试协商新行的时间.我修改了上面接受的两个答案来处理AllowUserToAddRows = true.

循环答案:

String searchValue = "somestring";
int rowIndex = -1;
foreach(DataGridViewRow row in DataGridView1.Rows)
{
    if (row.Cells["SystemId"].Value != null) // Need to check for null if new row is exposed
    {
        if(row.Cells["SystemId"].Value.ToString().Equals(searchValue))
        {
            rowIndex = row.Index;
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

LINQ答案:

int rowIndex = -1;

bool tempAllowUserToAddRows = dgv.AllowUserToAddRows;

dgv.AllowUserToAddRows = false; // Turn off or .Value below will throw null exception

    DataGridViewRow row = dgv.Rows
        .Cast<DataGridViewRow>()
        .Where(r => r.Cells["SystemId"].Value.ToString().Equals(searchValue))
        .First();

    rowIndex = row.Index;

dgv.AllowUserToAddRows = tempAllowUserToAddRows;
Run Code Online (Sandbox Code Playgroud)

  • 我来不及几年,但迟到总比我想的要好.:)因为发现给你一个+1. (3认同)