Как выбрать строку просмотра данных программно в C#

Мне нужно выбрать всю строку, если ячейка в столбце 0 содержит указанное значение. У меня есть TextBox и DaraGridView.when я помещаю значение, существующее в строке сетки, выбранной без проблем. Но когда пут не существует в таблице, программа выдает исключение, спасибо заранее!

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 ответа

Решение

Неясно, что вы пытаетесь достичь здесь. Похоже, это какой-то механизм "фильтра" или "выбора". Все, что вы пытаетесь сделать здесь... кажется, вы идете по этому пути самым сложным способом.

Как другие указали на эту ошибку... Последовательность не содержит элементов?

В комментариях и ошибке "ясно" говорится, что вы получаете "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() вернет ноль, если текст не найден. Это означает, что он не "потерпит неудачу" с "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
      }
    }
  }
}

Последовательность не содержит элементов

Это говорит мне, что .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;
    }
}
Другие вопросы по тегам