4

私はWinForms画面DataGridViewとBack/Nextボタンを持っています。FormLoadでは、グリッドに XML ドキュメントの値が取り込まれます。その後、ユーザーはグリッド内の任意のセルの値を変更できます。SaveGridValuesToXmlグリッド セルから更新された値で XML ファイルを更新するメソッドを作成しました。

これはほとんど問題なく動作SaveGridValuesToXmlし、グリッドの Leave イベントからメソッドを起動したので、ユーザーが [戻る] または [次へ] をクリックしてグリッドがフォーカスを失うと、save メソッドが呼び出されます。

私が抱えている問題は、グリッドがフォーカスを失ったときにフォーカスがあったセルを除いて、すべてのセル値が更新され、XML ファイルに正しく反映されることです。たとえば、3 列のグリッドで、最初の行の 1 番目、2 番目、3 番目のセルを更新すると、グリッドがフォーカスを失うと、1 番目と 2 番目のセルで行った変更のみが 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() から呼び出します - あなたの例では、休暇ハンドラーも機能しますが、2 つの間に大きな違いはありません。

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 に答える