簡體   English   中英

如何在c#中以編程方式選擇datagridview行

[英]how to select datagridview row programmatically in c#

如果第 0 列中的單元格包含指定值,我需要選擇整行。 我有一個 TextBox 和 DaraGridView。當我在 gridview 行中選擇存在的值時沒有問題但是當 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;
    }
}

數據網格視圖圖像

該序列不包含任何元素

這告訴我.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;
    }
}

目前尚不清楚您要在這里完成什么。 它似乎是某種“過濾器”或“選擇”機制。 無論你想在這里完成什么……看起來你是在以最困難的方式去做這件事。

正如其他人指出的這個錯誤...... 序列不包含元素?

注釋和錯誤“清楚地”指出,您收到了“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
      }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM