Как сравнить ячейку представления сетки и строку

#c# #winforms

#c# #winforms

Вопрос:

Как мне сравнить ячейку просмотра сетки со строкой и, если они совпадают, вывести ее в переменную, а затем перейти к следующей ячейке и повторить. Это то, что у меня есть до сих пор, но, похоже, это не работает

 private void btnfinalize_Click(object sender, EventArgs e)
{
    for (int i = 0; i < dataGridView1.Rows.Count;   i)
    {
        if(dataGridView1.Rows[i].Cells[0].Value.ToString() == "Manga vol 1 - 5")
        {
            Global.Book1 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Manga vol 6-15")
        {
            Global.Book2 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Novels 1-199")
        {
            Global.Book3 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Novels 200-400")
        {
            Global.Book4 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Comics series mainstream")
        {
            Global.Book5 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value == "Comics series secondary")
        {
            Global.Book6 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Text book 1 semester/2 modules")
        {
            Global.Book7 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Text book module add-ons")
        {
            Global.Book8 = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }
        else if (dataGridView1.Rows[i].Cells[0].Value.ToString() == "Hardcover")
        {
            Global.Hardcover = Int32.Parse(dataGridView1.Rows[i].Cells[1].Value.ToString());
        }

    }
  

я получаю
Исключение System.NullReferenceException: ‘Ссылка на объект не установлена на экземпляр объекта.’

Система.Windows.Формы.DataGridViewCell.Значение.возвращаем значение null.

ошибка

Комментарии:

1. Что вы подразумеваете под «похоже, это не работает»? Пожалуйста, не могли бы вы предоставить больше информации?

2. Не могли бы вы добавить больше информации, например, о неправильном выводе или сообщении об исключении? Кроме того, я думаю, switch statement это лучший выбор.

3. я получаю исключение System.NullReferenceException: ‘Ссылка на объект не установлена для экземпляра объекта.’ System. Windows. Формы. DataGridViewCell.Значение. возвращаем null.ошибка

Ответ №1:

Если вы получаете NullReferenceException , это, вероятно, потому, что вы пытаетесь прочитать значение из ячейки, которой нет в данных.

Вы уверены, что каждая строка содержит как минимум 2 ячейки? В настоящее время ваш код предполагает, что в каждой строке есть по крайней мере одна ячейка ( Cells[0].Value ), и в зависимости от значения первой ячейки ваш код также предполагает наличие второй ячейки ( Cells[1].Value ).

Вот гораздо лучший способ подойти к этому:

 for (int i = 0; i < dataGridView1.Rows.Count;   i)
{
    var row = dataGridView1.Rows[i];

    if (row.Cells.Count() < 2 || row.Cells[0] == null || row.Cells[1] == null)
    {
        continue; // skips rows that do not have at least 2 cells
    }

    var value = int.Parse(row.Cells[1].Value?.ToString() ?? "0");

    switch (row.Cells[0].Value.ToString())
    {
        case "Manga vol 1 - 5":
            Global.Book1 = value;
            break;
            
        case "Manga vol 6-15":
            Global.Book2 = value;
            break;
            
        case "Novels 1-199":
            Global.Book3 = value;
            break;
            
        case "Novels 200-400":
            Global.Book4 = value;
            break;
            
        case "Comics series mainstream":
            Global.Book5 = value;
            break;
            
        case "Comics series secondary":
            Global.Book6 = value;
            break;
            
        case "Text book 1 semester/2 modules":
            Global.Book7 = value;
            break;
            
        case "Text book module add-ons":
            Global.Book8 = value;
            break;
            
        case "Hardcover":
            Global.Hardcover = value;
            break;
    }
}
  

Комментарии:

1. строка.Ячейки. Подсчитайте, что эта строка не работает, потому что она не содержит определения для нее

2. Если row.Cells это массив, используйте row.Cells.Length . Если это коллекция, используйте row.Cells.Count . Если это IEnumerable , используйте row.Cells.Count() и добавьте using System.Linq в верхней части файла.

3. по-прежнему выдается ошибка с этой строкой var value = int.Parse(строка.Ячейки [1].Значение. toString());

4. Что ж, тогда ваши данные определенно содержат нули. Реальное решение здесь — выяснить, почему ваши данные содержат нули, и исправить это из источника. Тем временем попробуйте добавить row.Cells[0] == null || row.Cells[1] == null к оператору if, как я только что отредактировал в своем ответе.

5. даже с этой строкой ошибка все еще возникает на var value = int.Parse(row.Cells[1].Value.ToString());