如何在c#中以编程方式选择datagridview行

时间:2018-05-29 19:17:52

标签: c# exception datagridview selecteditem datagridviewrow

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

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 Image

2 个答案:

答案 0 :(得分:1)

  

序列不包含元素

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

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

library(ggplot2)
x<-Allele<- c(4,4,5,5,5,7,9,11,11,11,13,14,15,15,16,17,17,19,19,19)
y<-SR<- c(5.5,5.6,5.7,6,6.1,8,8,12,12.1,13,14,14,16,16.5,17,17,
17.1,18,19,20)
D3S = data.frame(Allele, SR)
Mod <- lm(SR ~ Allele) 
pred.int <- predict(Mod, interval = "prediction")
mydata <- cbind(D3S, pred.int)
# Regression line + confidence interval
p <- ggplot(mydata, aes(Allele, SR)) +
geom_point(size=3) +
stat_smooth(method = lm, color="black")
# Add prediction intervals
myplot= p + geom_line(aes(y = lwr), color = "black", 
linetype = "dashed", size=0.8)+
geom_line(aes(y = upr), color = "black", 
linetype = "dashed", size=0.8)
myplot + theme_bw() + theme(panel.border = element_blank(), 
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(), 
axis.line = element_line(colour = "black"))

答案 1 :(得分:0)

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

正如其他人指出这个错误...... 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将为null并且代码将在下一行上“失败”......这带有空指针异常的时间,因为如果找不到文本,row将为null。

在不了解您要在整体视角中尝试做什么的情况下,我强烈建议您使用某种“集合”将数据存储在网格中,其中大多数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
      }
    }
  }
}