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 скажет, что это была особенность.