C# Winforms: событие выхода DataGridView не получает значение последней обновленной ячейки

У меня есть экран WinForms с DataGridView на нем и кнопки Назад / Далее. На FormLoadсетка заполняется значениями из документа XML. Затем пользователь может изменить значение любой ячейки в сетке. Я создал SaveGridValuesToXml метод, который обновляет файл XML с обновленными значениями из ячеек сетки.

Это в основном работает хорошо, и я уволил SaveGridValuesToXml метод из события Leave в сетке, поэтому, когда пользователь нажимает назад или далее и сетка теряет фокус, вызывается метод save.

У меня проблема в том, что все значения ячеек обновляются и корректно отражаются в файле XML, КРОМЕ для ячейки, которая имела фокус, когда сетка теряет фокус. Например, в сетке из трех столбцов, если я обновляю первую, вторую и третью ячейки в первой строке, когда сетка теряет фокус, только изменения, которые я сделал в первой и второй ячейках, сохраняются в моем файле XML.

Примеры кода следующие:LoadXmlDataIntoGridGridView() Метод вызывается при загрузке родительской формы.

XmlDataDocument xmlData = new XmlDataDocument();

private void LoadXmlDataIntoGridGridView()
{        
    xmlData.DataSet.ReadXml(@"C:\testFile.xml");
    uxMappingDataGridView.DataSource = xmlData.DataSet;
    uxMappingDataGridView.DataMember = "Item";
}

private void uxBackButton_Click(object sender, EventArgs e)
{
    this.Hide();
    uxSettingsUserControl settingsScreen 
       = ParentForm.Controls["uxSettingsUserControl"] as uxSettingsUserControl;
    settingsScreen.Show();
}

private void uxNextButton_Click(object sender, EventArgs e)
{
    this.Hide();
    uxLoadScriptUserControl loadScriptScreen 
       = ParentForm.Controls["uxLoadScriptUserControl"] as uxLoadScriptUserControl;
    loadScriptScreen.Show();
}

private void uxMappingDataGridView_Leave(object sender, EventArgs e)
{
    SaveGridValuesToXml();
}

private void SaveGridValuesToXml()
{   
    xmlData.DataSet.WriteXml(@"C:\testFile.xml");
}

Какие-либо предложения?

1 ответ

Решение

Это связано с тем, что в настоящее время редактирование ячейки не фиксируется, когда вы покидаете сетку нажатием кнопки. 1

Чтобы получить это последнее значение, нужно принудительно зафиксировать изменения, вызвав EndEdit() на сетке.

В приведенном ниже коде я вызываю его из SaveGridValuesToXml() - в вашем примере также будет работать обработчик отпуска, без существенной разницы между ними.

private void uxMappingDataGridView_Leave(object sender, EventArgs e)
{
    SaveGridValuesToXml();
}

private void SaveGridValuesToXml()
{   
    uxMappingDataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
    xmlData.DataSet.WriteXml(@"C:\testFile.xml");
}

1 Не совсем уверен, почему это работает именно так - лично я чувствую себя багом, но, возможно, кто-то из команды разработчиков DataGridView скажет, что это была особенность.

Другие вопросы по тегам