#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 (если вы наведете курсор мыши на «Ячейки» или «строку», он покажет вам их содержимое «.