トップ回答者
バインドしたコントロールの値を消しても以前の値に戻ってしまう

質問
-
お世話になります。
ある入力画面があります。
入力項目が非常に多くコントロールも小さいため、
拡大ボタンをクリックすると小画面(入力項目の拡大画面)が開き、
拡大画面からも入力が可能。という仕様になっております。
以上のことから、2画面間で同じデータをやり取りする必要があるため
お互いにバインドをやり取りして実現しました。
ところが更新時において、一方の画面でテキストボックスを空白にし、
もう一方の画面を開くと空白にする前のデータが表示されてしまいます。
逆方向でも同じです。
入力が出来るが消せない状態になってしまいました。
原因は何が考えられますでしょうか?
//バインド ※両画面に記述 this.txt氏名.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._bind, "氏名", true)); //小画面の起動 private void btn拡大_Click(object sender, EventArgs e) { Frm小画面 frm = new Frm小画面(); frm.Bind = this._bind; frm.ShowDialog(this); //小画面にて入力した値を反映 this._bind = frm.Bind; this._bind.ResetBindings(false); }
回答
-
提示されていたコードを元に検証プロジェクトを作ってみたんですが、ちゃんと親フォーム・子フォームどちらでも更新されますけどねぇ・・・
気になるのは_bind(多分BindingSource?)の定義ですが、見直すとしたらそのへんでしょうか。
とりあえず検証時に書いたコードを貼っておきますので、ご自分のコードと見比べてみてください。public partial class Form1 : Form { BindingSource _bind = new BindingSource(); public Form1() { InitializeComponent(); _bind.DataSource = new Sample(); this.txt氏名.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._bind, "氏名", true)); } private void btn拡大_Click(object sender, EventArgs e) { Frm小画面 frm = new Frm小画面(); frm.Bind = this._bind; frm.ShowDialog(this); //小画面にて入力した値を反映 this._bind = frm.Bind; this._bind.ResetBindings(false); } } public class Sample { string _氏名 = ""; public string 氏名 { get { return _氏名; } set { _氏名 = value; } } } public partial class Frm小画面 : Form { BindingSource _bind; public BindingSource Bind { get { return _bind; } set { _bind = value; } } public Frm小画面() { InitializeComponent(); } private void Frm小画面_Shown(object sender, EventArgs e) { this.txt氏名.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._bind, "氏名", true)); } }
あと、BindingオブジェクトのControlUpdateMode/DataSourceUpdateModeの設定やValidationなんかに引っ張られるケースも考えられますので、そのへんも見直してみるべきでしょう。
以上、参考までに。
- 回答としてマーク sumi_sumi 2013年1月24日 7:18
すべての返信
-
提示されていたコードを元に検証プロジェクトを作ってみたんですが、ちゃんと親フォーム・子フォームどちらでも更新されますけどねぇ・・・
気になるのは_bind(多分BindingSource?)の定義ですが、見直すとしたらそのへんでしょうか。
とりあえず検証時に書いたコードを貼っておきますので、ご自分のコードと見比べてみてください。public partial class Form1 : Form { BindingSource _bind = new BindingSource(); public Form1() { InitializeComponent(); _bind.DataSource = new Sample(); this.txt氏名.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._bind, "氏名", true)); } private void btn拡大_Click(object sender, EventArgs e) { Frm小画面 frm = new Frm小画面(); frm.Bind = this._bind; frm.ShowDialog(this); //小画面にて入力した値を反映 this._bind = frm.Bind; this._bind.ResetBindings(false); } } public class Sample { string _氏名 = ""; public string 氏名 { get { return _氏名; } set { _氏名 = value; } } } public partial class Frm小画面 : Form { BindingSource _bind; public BindingSource Bind { get { return _bind; } set { _bind = value; } } public Frm小画面() { InitializeComponent(); } private void Frm小画面_Shown(object sender, EventArgs e) { this.txt氏名.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._bind, "氏名", true)); } }
あと、BindingオブジェクトのControlUpdateMode/DataSourceUpdateModeの設定やValidationなんかに引っ張られるケースも考えられますので、そのへんも見直してみるべきでしょう。
以上、参考までに。
- 回答としてマーク sumi_sumi 2013年1月24日 7:18
-
みっとさま いつも有難う御座います。
サンプルソース有難う御座います。
一部のコードしか記載していなかったのに補完までしていただき有難う御座います。
ControlUpdateModeやDataSourceUpdateModeなど知りませんでした。
この辺りを調べてみました。
バインドさせてる箇所の引数にこのプロパティの設定を1つ加えました。
this.txt氏名.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._bind, "氏名", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
これを両画面で設定したらOKでした。
助かりました。有難う御座いました。