1

bindingSource クラスを使用せず、Windows フォーム アプリケーションにバインド機能を実装することにしました。私はいくつかの点に成功していますが、複雑さはほとんどありません。理由を知りたいです。データソースと 3 つのコントロール (textbox1、textbox2、checkedBox1) から DataTable を埋めました。コントロールをバインドし、値を表示することができました。

txtBox1.DataBindings.Add("Text", myTable, "NAME", true, DataSourceUpdateMode.Never);

ご想像のとおり、 myTable は、データベース テーブルから入力されたデータを含むデータ テーブルです。次のように、現在の行の値を CurrencyManager で取得できます。

DataRow dr = ((DataRowView)this.BindingContext[myTable].Current).Row;

しかし、現在の行を使用して値を変更したい場合、最初のフィールドが設定された後、他のフィールドは自動的に以前の値に変更されます。つまり:

dr["NAME"]= textBox1.Text;


dr["SURNAME"] = textBox2.Text;  //this set seems useless

最初の割り当ては機能しますが、編集が始まる前に textBox2、checkBox1 が値を元に戻すフォーム コントロールです。したがって、この方法で行全体を更新することはできません。
一方、BindingSource を使用すると、現在の行と同様のスタイルが得られます。

DataRow drB = ((DataRowView)bindingSource1.Current).Row;

そして、この行のフィールドを次のように変更します。

drB["NAME"] = textBox1.Text;
drB["SURNAME"] = textBox2.Text;
drB["ACTIVE"] = checkBox1.Checked;

編集を次のように終了します。

bindingSource1.EndEdit();

行全体が正常に変更されたため、すべてのテーブルを更新する準備ができています。違いを見て、bindingSourceを使わずに管理したいと思います。EndEdit() が行うものを使用する必要があるということですか? 私は何を見逃していますか、それとも強迫観念を忘れていますか?

4

2 に答える 2

0

少し手がかりを逃したので、正解は自分自身を示しています。コントロール値からデータ行フィールドを直接変更する前に、一時変数を使用していました。そのため、制御値が元の値に戻ったとしても、行フィールド全体を変更して、最終的に制御値を新しい値に変更することができます。つまり:

string s1 = textBox1.Text;
string s2 = textBox2.Text;
bool b1 = checkBox1.Checked;
dr["NAME"] = s1;
dr["SURNAME"] = s2;
dr["ACTIVE"] = b1;

これらの一時変数を使用すると、最初の割り当て後に制御値が変更され、最後にすべて新しい値になります。
誰かが必要なら、頑張ってください。

于 2011-08-19T06:58:01.510 に答える