1

如果第 0 列中的单元格包含指定值,我需要选择整行。我有一个 TextBox 和 DaraGridView。当我把一个值存在于 gridview 行中时选择没有问题但是当一个 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;
    }
}

DataGridView 图像

4

2 回答 2

1

该序列不包含任何元素

这告诉我.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;
    }
}

或者,如果要选择包含文本的所有行...

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;
    }
}
于 2018-05-29T19:38:53.797 回答
0

目前尚不清楚您要在这里完成什么。它似乎是某种“过滤”或“选择”机制。无论你想在这里完成什么……看起来你正在以最困难的方式来做这件事。

正如其他人指出的这个错误......序列不包含元素?

注释和错误“清楚地”表明,您将收到“InvalidOperationException”。因此,我不是 LINQ 专家,我猜测当您使用以下命令时……</p>

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

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

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

FirstOrDefault()如果未找到文本,将返回 null。这意味着当找不到文本时,它不会因“InvalidOperationException”而“失败”……但是,变量row将为空,代码将在下一行强制“失败”……这次是空指针row如果找不到文本,则异常 since将为空。

在不知道您要从整体角度做什么的情况下,我只能强烈建议您使用某种“集合”来将数据存储在网格中,其中大多数DataSources都内置了机制来帮助执行诸如搜索/排序之类的事情等等......显然需要您做更多的工作来自己管理网格数据。

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

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
      }
    }
  }
}
于 2018-05-30T04:04:32.453 回答