4

我有一个 WinForms 屏幕,DataGridView上面有一个和 Back/Next 按钮。在 上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");
}

有什么建议么?

4

1 回答 1

7

这是因为当您通过单击按钮离开网格时,当前正在编辑的单元格未被提交。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 产品团队中的某个人可能会说这是一个功能。

于 2012-08-04T10:39:51.247 回答