Perić Željko Ответов: 1

Как правильно изменить список элементов внутри только одного datagridviewcomboboxcell ?


Привет,
Я пишу простое приложение, которое использует элемент управления DataGridView с ComboBoxColumn.
Я использовал этот метод для изменения списка элементов внутри одной ячейки ComboBoxColumn :

void Fill_Location()
{
    DataGridViewComboBoxCell Location = (DataGridViewComboBoxCell) DGV.Rows[0].Cells[1];

    Location.Items.Clear();

    string a ="hello";

    Location.Items.Add(a);
}


При выполнении этого метода возникает диалоговое окно DataGridView Default Error с сообщением:

Следующее исключение в datagridview
Система.ArgumentException : значение DataGridViewComboBoxCell недопустимо.
Чтобы заменить это диалоговое окно по умолчанию, пожалуйста, обработайте событие DataError.


Поэтому я назначил DGV этот обработчик событий DataError :

void DGV_DataError(object sender, DataGridViewDataErrorEventArgs e)
{

        MessageBox.Show(e.Context.ToString());
}

После этого при выполнении метод вызывает обработчик события DataGridView DataError со следующим сообщением : форматирование, PreferredSize.

С тех пор я не знаю, как устранить вышеуказанную ошибку,
Я изменил код для обработчика событий DataError на :

void DGV_DataError(object sender, DataGridViewDataErrorEventArgs e)
{

    if(e.Context== DataGridViewDataErrorContexts.Formatting)
        e.ThrowException = false;

}

Теперь при выполнении метода Fill_Location() список элементов внутри ComboBoxCell изменяется, как и ожидалось, и нет никакого сообщения об ошибке.


Правильно ли это использование обработчика событий DataError для решения такого рода проблем,
или могут быть какие-то другие скрытые проблемы, которые в настоящее время не очевидны.

Программа написана для .Net 4.0

Всего наилучшего,
Желько Перич

Что я уже пробовал:

Я искал в Интернете аналогичные проблемы с DataGridViewComboBox и изменением списка элементов только в одной ячейке. Есть сообщения об одних и тех же сообщениях об ошибках, но адекватного решения нет.

1 Ответов

Рейтинг:
7

Maciej Los

Действительно, я не понимаю, почему вы хотите заменить элементы DataGridViewComboBoxCell. Тем не менее...

Цитата:
Правильно ли это использование обработчика событий DataError для решения такого рода проблем,
или могут быть какие-то другие скрытые проблемы, которые в настоящее время не очевидны.


Вероятно, это не самое лучшее решение, потому что вы отключили другие ошибки...

Я бы решил эту проблему с помощью одного из следующих методов:
способ № 1
bool disableHandler = false;

void Fill_Location()
{
    disableHandler = true;
    DataGridViewComboBoxCell Location = (DataGridViewComboBoxCell) DGV.Rows[0].Cells[1];
    Location.Items.Clear();
    string a ="hello";
    Location.Items.Add(a);
    disableHandler = false;
}

void DGV_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
    if(disableHandler)
        e.ThrowException = false;
    else
        MessageBox.Show(e.Context.ToString());
}


способ № 2
void Fill_Location()
{
    DGV.DataError -= new EventHandler(DGV_DataError);
    DataGridViewComboBoxCell Location = (DataGridViewComboBoxCell) DGV.Rows[0].Cells[1];
    Location.Items.Clear();
    string a ="hello";
    Location.Items.Add(a);
    DGV.DataError += new EventHandler(DGV_DataError);
}


Для обработки ошибок данных, пожалуйста, смотрите раздел: Практическое руководство.Событие DataError (System.Окна.Формы) | Microsoft Docs[^]


Perić Željko

Спасибо за решение.

Maciej Los

Всегда пожалуйста.
Если это было полезно, пожалуйста, примите его (зеленая кнопка).