, поэтому при заполнении моего представления данных я обычно делаю что-то вроде
public void FillTable(CoBRAMetaField[] metaFields)
{
dataGridView.Rows.Clear();
// do something with metaFields
}
Важно:
Моя сетка заполнена правильно (извините, язык немецкий)
Когда я заполняю сетку в другой раз, я хочу удалить только строки с метаполями, которых нет в новом массиве metaFields.Мне нужно такое поведение, потому что, когда пользователь выбрал значение для этой строки, я не хочу, чтобы оно удалялось и создавалось заново, потому что затем выбранное значение также удаляется.
Я придумал это
public void FillTable(CoBRAMetaField[] metaFields)
{
for (int i = 0; i < dataGridView.Rows.Count; i++) // loop through the grid rows
{
double metaFieldID = (dataGridView.Rows[i].Cells[0].Tag as CoBRAMetaField).ID; // get the ID from the row metaField
if (metaFields.Any(field => field.ID == metaFieldID)) // Does it exist?
metaFields = metaFields.Where(field => field.ID != metaFieldID).ToArray(); // Remove it from the new array
else // it doesn't exist
dataGridView.Rows.Remove(dataGridView.Rows[i]); // remove the row
}
// Fill the grid with the remaining metaFields
}
Первый запуск корректно инициализируется
при втором запуске происходит сбой, некоторые поля остаются пустыми
, когда я нажимаю кнопку в этом ряду, я получаю исключение нулевого указателя.Я получаю эту ошибку только при использовании «нового кода», так что я что-то упустил?Есть ли что-то, о чем я не думал?
Я приведу полный пример здесь
Сначала создайте DataGridView
и Button
наформа.Создайте файл для всех необходимых классов и возьмите этот фрагмент
https://pastebin.com/BFmr2ps9
После этого заполните код формы некоторыми тестовыми данными
https://pastebin.com/Yz84Akkj
и теперь настройте DataGridView
логику
https://pastebin.com/qH6kZKZv
Я добавил
dataGridView.AllowDrop = false;
dataGridView.AllowUserToAddRows = false;
dataGridView.AllowUserToDeleteRows = false;
dataGridView.AllowUserToOrderColumns = false;
dataGridView.AllowUserToResizeRows = false;
, если вы просто хотите скопировать вставку, но вы также можете сделать это с помощьюдизайнер форм.Посмотрите на dataGridView.Rows.Clear();
, это рабочий пример. Прокомментируйте и используйте приведенный выше код для проверки неверного примера