#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());