2

WinForms アプリケーションでの単純なテーブル編集に問題があります。私は一歩を踏み外したに違いない。

でデータベースに接続されたDataSetを含む があります。に があります。フォームには、 にバインドされているものがあります。バインドは Designer で行われ、次のような機械で作成されたステートメントが作成されました。DataTableSqlDataAdapterSqlCommandBuilderSqlDataAdapterTextBoxesDataTable

this.tbLast.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.belkData, "belk_mem.last", true));

の行に入力するDataTableと、データベースの値がテキスト ボックスに表示されますが、 の内容を変更するTextBoxと、変更が に反映されないようDataTableです。変更を保存しようとすると、次の両方が null を返します。

DataTable dtChanges = dtMem.GetChanges();
DataSet dsChanges = belkData.GetChanges();

私は何を忘れましたか?


編集 - mrlucmorinへの応答:

保存はボタンの下にあります。コードは次のとおりです。

    BindingContext[belkData, "belk_mem"].EndCurrentEdit();

    try
    {
        DataSet dsChanges = belkData.GetChanges();
        if (dsChanges != null)
        {
            int nRows = sdaMem.Update(dsChanges);
            MessageBox.Show("Row(s) Updated: " + nRows.ToString());
            belkData.AcceptChanges();
        }
        else { MessageBox.Show("Nothing to save.", "No changes"); }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: " + ex.Message);
    }

動作を変更せずに、これらのステートメントを入れてみました。

dtMem.AcceptChanges();
belkData.AcceptChanges();
4

3 に答える 3

0

あなたの問題は単に5文字が欠けていたことです....あなたは.lastそのdataMember物件に行方不明でした。

BindingContext[belkData, "belk_mem"].EndCurrentEdit();

になるはずだった

BindingContext[belkData, "belk_mem.last"].EndCurrentEdit();

解決する別の方法は、仲介者を使用して、呼び出す前に仲介者BindingSourceを呼び出すことです。EndEdit()GetChanges()

バインディングを次のように変更します。

BindingSource bs = new BindingSource();
bs.DataSource = belkData;
tbLast.DataBindings.Add("Text", bs, "belk_mem.last", true);

保存ボタンのコードを次のように変更します

try
{
    bs.EndEdit(); // needs to be called before getting changes.
    DataSet dsChanges = belkData.GetChanges();
    if (dsChanges != null)
    {
        int nRows = sdaMem.Update(dsChanges);
        MessageBox.Show("Row(s) Updated: " + nRows.ToString());
        belkData.AcceptChanges();
    }
    else { MessageBox.Show("Nothing to save.", "No changes"); }
}
catch (Exception ex)
{
    MessageBox.Show("Error: " + ex.Message);
}

EndEdit()仲介者の使用を避けたい場合は、個々の行を呼び出すこともできますBindingSource

belkData.Rows[0].EndEdit(); 

または、複数の行を扱っている場合

foreach( DataRow row in belkData.Rows )
    row.EndEdit();

EndEdit()なぜ、またはEndCurrentEdit()最初に呼び出される必要があるのか​​ を理解するのに苦労している人々のために。Row States and Row VersionsおよびBindingSource.EndEdit Methodに関するドキュメントをご覧ください。を呼び出すまで、バインディングは編集状態のままであり、変更は のバージョンでEndEdit()のみ表示されます。呼び出すと、変更がバージョンに移動します。そうして初めて、「変更あり」になります。はバージョンを見ないでください。ProposedDataTableEndEdit()CurrentDataTableDbDataAdapterProposed

于 2016-10-21T19:12:05.400 に答える
0

Bindingインスタンスの作成時にDataSourceUpdateMode.OnPropertyChangedがありません。

于 2012-10-26T16:51:25.723 に答える
0

* BindingSource も使用している場合: シンプルな BindingSource.EndEdit() を実行するだけで、TextBox データが DataTable に送信されます。例:-

_bsHeader.EndEdit();
if (_dsHeader.HasChanges())
{
    DataTable dsInsert = _dsHeader.GetChanges(DataRowState.Added).Copy();
    _objDal.Insert(dsInsert);
}

これがここでつまずいた人の助けになることを願っています。

于 2013-03-13T08:45:27.877 に答える