如何在 C# 中以编程方式 select datagridview 行

how to select datagridview row programmatically in c#

如果第 0 列中的单元格包含指定值,我需要 select 整行。我有一个 TextBox 和 DaraGridView.when 我把一个值存在于 gridview 行 selected 没有问题但是当 put 在 gridview 中不存在时程序抛出异常 提前谢谢你!!

private void Searchvalue_TextChanged(object sender, EventArgs e)
{
    dataGridView1.ClearSelection();
    var enteredText = (sender as TextBox).Text;
    int rowIndex = -1;

    bool tempAllowUserToAddRows = dataGridView1.AllowUserToAddRows;

    // Turn off or .Value below will throw null exception
    dataGridView1.AllowUserToAddRows = false; 
    if (enteredText != String.Empty)
    {
        DataGridViewRow row = dataGridView1.Rows
            .Cast<DataGridViewRow>()
            .Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).First();
        rowIndex = row.Index;
        dataGridView1.AllowUserToAddRows = tempAllowUserToAddRows;
        dataGridView1.Rows[rowIndex].Selected = true;
        dataGridView1.FirstDisplayedScrollingRowIndex = dataGridView1.Rows[rowIndex].Index;
    }
}

The sequence contains no elements

这告诉我 .First() 在下面的代码中失败了。

if (enteredText != String.Empty)
{
    DataGridViewRow row = dataGridView1.Rows
        .Cast<DataGridViewRow>()
        .Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText))
        .First();
    rowIndex = row.Index;
    dataGridView1.Rows[rowIndex].Selected = true;
}

改成这个避免异常(其他小东西也改了)

if (!string.IsNullOrEmpty(enteredText))
{
    var row = dataGridView1.Rows
        .Cast<DataGridViewRow>()
        .FirstOrDefault(r => ((string)r.Cells["Column1"].Value).Contains(enteredText));
    if (row != null)
    {
        row.Selected = true;
    }
}

或者,如果您想要 select 所有包含文本的行...

if (!string.IsNullOrEmpty(enteredText))
{
    var rows = dataGridView1.Rows
        .Cast<DataGridViewRow>()
        .Where(r => ((string)r.Cells["Column1"].Value).Contains(enteredText));
    foreach (var row in rows)
    {
        row.Selected = true;
    }
}

不清楚您要在这里完成什么。它似乎是某种“过滤器”或“选择”机制。无论你在这里试图完成什么......看起来你正在以最困难的方式解决这个问题。

正如其他人指出的这个错误……Sequence contains no elements?

评论和错误“明确”指出,您收到“InvalidOperationException”。因此,我不是 LINQ 专家,我猜测当您使用以下命令时……

Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).First();

如果 enteredText 没有找到…….First() 会去 return 做什么?这可能是您错误的原因。用下面评论良好的解决方案替换它可能会解决“这个”问题。

Where(r => r.Cells["Column1"].Value.ToString().Contains(enteredText)).FirstOrDefault();
如果找不到文本,

FirstOrDefault() 将 return 为空。这意味着当找不到文本时,它不会因“InvalidOperationException”而“失败”……但是,变量 row 将为空,并且代码将在下一行强制“失败”……这出现空指针异常的时间,因为如果找不到文本,row 将为空。

在不知道您从整体角度想做什么的情况下,我只能强烈建议您使用某种“集合”将数据存储在网格中,其中大部分 DataSources 已经内置在做 searching/sorting 等事情时提供帮助的机制......显然需要您做更多的工作来自己管理网格数据。

在不使用数据源的情况下,下面的代码应该可以完成您所描述的内容。

private void Searchvalue_TextChanged(object sender, EventArgs e) {
  dataGridView1.ClearSelection();
  var targetText = Searchvalue.Text;
  if (targetText != String.Empty) {
    foreach (DataGridViewRow row in dataGridView1.Rows) {
      if (!row.IsNewRow && row.Cells["Column1"].Value != null && row.Cells["Column1"].Value.ToString().Contains(targetText)) {
        row.Selected = true;
        dataGridView1.FirstDisplayedScrollingRowIndex = row.Index;
        break;  // remove this if you want to select all the rows that contain the text
      }
    }
  }
}