【问题标题】:how to select datagridview row programmatically in c#如何在 C# 中以编程方式选择 datagridview 行
【发布时间】:2018-05-29 19:17:51
【问题描述】:

如果第 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;
    }
}

【问题讨论】:

  • "抛出异常"....我们怎么可能在不知道更多信息的情况下帮助您?什么是异常类型?消息是什么?
  • [链接] ibb.co/fiTGLy
  • 附加信息:序列不包含任何元素。

标签: c# exception datagridview selecteditem datagridviewrow


【解决方案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;
    }
}

【讨论】:

  • 在 gridview 中放入不存在的值时抛出异常“WindowsFormsApplication1.exe 中发生了“System.NullReferenceException”类型的未处理异常附加信息:对象引用未定义到对象。”
  • @KAMAL96 你在哪一行得到这个错误?一旦你知道什么是空的,NullReferenceExceptions 就很容易修复。这可能是转换为字符串。而不是((string)r.Cells["Column1"].Value).Contains(enteredText) 尝试r.Cells["Column1"].Value.ToString().Contains(enteredText)。
  • 同一个异常“NullReferenceExceptions”
  • @KAMAL96 与什么异常相同?这是您第一次提到 NullReferenceException。 “序列不包含任何元素”将是 InvalidOperationException,而不是 NullReferenceException。
【解决方案2】:

目前尚不清楚您要在这里完成什么。它似乎是某种“过滤”或“选择”机制。无论您在这里尝试完成什么……看来您都在以最困难的方式进行。

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

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

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 以来的空指针异常将为空。

在不知道您要从整体上做什么的情况下,我只能强烈建议您使用某种“收集”来将数据存储在网格中,其中大多数 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
      }
    }
  }
}

【讨论】:

  • 谢谢!!!当一个 put 值存在于 gridview 工作时没有任何问题,但一个 put 值在 gridview 中不存在 vs 抛出异常 'System.NullReferenceException'
  • 你需要展示你正在谈论的代码。如果单元格值为 null,我发布的代码不会抛出 NullReferrenceException,因为代码在 if 语句中使用 row.Cells["Column1"].Value != null 进行检查
  • 感谢您在我创建新项目时完美地完成了这个解决方案
猜你喜欢
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2021-08-02
  • 2012-03-11
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2017-01-30
相关资源
最近更新 更多