1

Есть код, который выводит строки в datagridview при выборе индекса из combobox. Но при сбросе через comboBox1.SelectedItem = null выдает ошибку. Почему выдает - понятно, а вот как решать - нет.

for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
{       
    dataGridView1.CurrentCell = null;
    dataGridView1.Rows[i].Visible = false;
    for (int c = 0; c < dataGridView1.Columns.Count; c++)
    {
         if(dataGridView1[c, i+1].RowIndex.ToString() == comboBox1.SelectedItem.ToString())
         {
            dataGridView1.Rows[i].Visible = true;
            break;
         }
    }
}
vmchar
  • 4,442
  • Конечно выдаёт, ведь null.ToString() никак не выполнится. Проверяйте SelectedItem на null либо (в c# 6.0 и выше) используйте null propagation: == comboBox1.SelectedItem?.ToString() – A K May 20 '19 at 11:45
  • 1
    Вот это выражение dataGridView1[c, i+1].RowIndex возвращает индекс строки. Но в цикле и так происходит проход по строкам. То есть это выражение равнозначно следующему: i+1. – Alexander Petrov May 20 '19 at 12:28

1 Answers1

1

Ну что значит как решать... Самой первой строкой ещё до приведённого кода поставьте проверку на null, вам же оба эти цикла не нужны вообще, если ничего не выбрано, верно?

if(comboBox1.SelectedItem == null)
    return;

Менее правильный вариант - заменить проверку (в c# 6.0 и выше) используя null propagation:

if(dataGridView1[c, i+1].RowIndex.ToString() == comboBox1.SelectedItem?.ToString())

(И что-то я не пойму: у вас же и RowIndex и SelectedItem - это наверняка и то и то int, зачем приводить к строкам?)

Проверка на 0 помогла c ошибкой, но после сброса таблица остается как после фильтрации, а не возвращается к полному списку.

Очень похоже, что вы хотите такую логику:

if(comboBox1.SelectedItem == null || dataGridView1[c, i+1].RowIndex.ToString() == comboBox1.SelectedItem.ToString())

Но также никто не мешает вам определить свою кастомную логику перед выходом:

if(comboBox1.SelectedItem == null)
{
    // TODO: Добавить обработку случая, когда нет выделения
    ...
    return;
}
A K
  • 28,718
  • Проверка на 0 помогла c ошибкой, но после сброса таблица остается как после фильтрации, а не возвращается к полному списку. А к строкам пришлось использовать потому что через .Equals он не может найти индекс и выдает пустую таблицу. – Daniel Dashkevich May 20 '19 at 11:59
  • @DanielDashkevich Обновил ответ. – A K May 20 '19 at 12:31
  • Работает как надо, спасибо за помощь – Daniel Dashkevich May 20 '19 at 12:35