Суммирование строк с одинаковым идентификатором строки

#c# #windows

#c# #Windows

Вопрос:

У меня есть проект, и я пытаюсь суммировать строки с одинаковым идентификатором вместе.

Например,:

 ID    Quantity

1     5 
1     7
2     10
2     18
1     8
 

Поэтому, когда я нажимаю кнопку, количество под идентификатором 1 даст мне 20, а для идентификатора 2 я получу 28.
Но я столкнулся с ошибкой, указывающей, что «Ссылка на объект не установлена для экземпляра объекта». Ниже приведены мои коды:

 id = int.Parse(row.Cells[0].Value.ToString()); 
 

Это код, который показывает сообщение об ошибке:

 int id = 0;
int qty = 0;
List<QuantityPerID> qtyList = new List<QuantityPerID>();

QuantityPerID qtyObj;

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    id = int.Parse(row.Cells[0].Value.ToString());
    qty = int.Parse(row.Cells[1].Value.ToString());
    qtyObj = new QuantityPerID();
    bool ifexists = false;

    if (qtyList != null amp;amp; qtyList.Count() > 0)
    {
        if (qtyList.Where(q => q.ID == id).Count() > 0)
        {
            ifexists = true;
        }
    }
    if (ifexists)
    {
        qtyObj = qtyList.Where(q => q.ID == id).First();
        qtyObj.Quantity  = qty;
    }
    else
    {
        qtyObj.ID = id;
        qtyObj.Quantity = qty;

        qtyList.Add(qtyObj);
    }
}
 

Я хотел бы также спросить, есть ли какой-либо другой более простой метод для достижения тех же результатов?

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

1. в какой строке вы получаете эту ошибку

2. id = int.Parse(строка.Ячейки[0].Значение. toString()); // я получаю ошибку в этой строке

3. Может быть, стоит подумать о чем-то другом, кроме идентификатора, который позволяет группировать элементы. Идея ID скорее в том, что они должны быть уникальными.

4. Я прочитал разные сообщения и узнал, что использование system.linq также может работать, но я действительно не знаю, как его кодировать

Ответ №1:

Вы уверены, что Cells[0] и Cells[1] не пусты? Вы вызываете toString для его значений. Проверьте, является ли значение null перед вызовом toString

 if( null != row.Cells[0].Value )
{
    id = int.Parse(row.Cells[0].Value.ToString());
}

if(null != row.Cells[1].Value)
{
    qty = int.Parse(row.Cells[1].Value.ToString());
}
 

Вы видите пустую строку в конце строк? Выполняет DataGridView.Для свойства allowusertoaddrow установлено значение true?
Если это так, то это проблема. Вы также считываете значения пустой строки.
Вместо foreach вы можете сделать это с помощью цикла for

 // notice the Count - 1. 
for(var index = 0; index < dataGridView1.Rows.Count - 1;   index)
{
    // your code here
}
 

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

1. Я ввел данные вручную в ячейки gridview. Когда я отлаживал его в первый раз, программа может считывать мой идентификатор строки, но для второго цикла появилось сообщение об ошибке

2. @EnlightenedCodes у вас есть пустая строка в конце? Автоматически сгенерированная строка? Если вы это сделаете, то вы получите к нему доступ.

3. У меня есть пустая строка после ввода последних данных

4. Помечено, но я не могу, потому что у меня недостаточно повторений

Ответ №2:

Разделите это определение

 id = int.Parse(row.Cells[0].Value.ToString()); 
 

на несколько частей, чтобы увидеть, что генерирует ваше исключение NullReferenceException (и, возможно, кол-во тоже).

Или, во время выполнения, вы можете проверить значения ячеек с помощью IntelliSense (если вы наведете курсор мыши на «Ячейки» или «строку», он покажет вам их содержимое «.