Как выбрать строку просмотра данных программно в C # - PullRequest
0 голосов
/ 29 мая 2018

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

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 голосов
/ 30 мая 2018

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

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

В комментариях и ошибке «ясно» говорится, что вы получаете «InvalidOperationException».Я не эксперт по LINQ, поэтому, я предполагаю, что когда вы используете следующую команду ...

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

Если enteredText НЕ найден ... что вернет .First()?Это может быть причиной вашей ошибки.Замена этого на хорошо прокомментированное решение ниже может решить проблему «this».

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

FirstOrDefault() вернет ноль, если текст не найден.Это означает, что он не «потерпит неудачу» с «InvalidOperationException», когда текст не найден ... однако переменная row будет иметь значение null, и код будет обязательным «провалиться» на следующей строке… на этот раз сисключение нулевого указателя, поскольку 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
      }
    }
  }
}
0 голосов
/ 29 мая 2018

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

Это говорит мне, что .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;
    }
}
...