2016-07-07 19 views
1

私はコントロールがさまざまなタブとパネル上にある複雑なフォームを持っています。これらのフォームでは、バインディングソースを使用してコントロールをデータソースにバインドします。バインディングソースと一致するコントロールのデータバインディングを確認する方法は?

開発中に、フォームのコントロールではなくデータソースのメンバーの名前が変更されている状況がある可能性があります。

フォームのロード時に例外がスローされないため、バインディングソースのデータソースメンバーをループし、コントロールのデータバインディング値と比較する方法はありますか?

このSO answerで説明されているように、非表示のコントロールには特に注意する必要があります。

このチェックはどこで行われますか?コンストラクタまたはOnLoad? (少なくとも、InitializeComponentの後に行うべきです。なぜなら、バインディングソースのデータソース、つまりtypeof(myObject)がこのメソッドで設定されているからです)。

+0

プロパティのデータバインディングがデータソースに存在しない場合、例外が発生します。 'データソースのプロパティまたは列XXXXXXにバインドできません。' –

+0

@RezaAghaei例外は発生していません。 –

+0

例外は発生しますが、スローされません - 例外設定を確認してください。場合によっては、 'Load'イベントハンドラでスローされた例外がスワローになることがあります。その場合、' Load ..'イベントハンドラを 'Try .. catch'でラップすることができます – Fabio

答えて

0

バインディングオブジェクトには、バインディング操作のステートメント(読み込み/書き込み)を取得するのに役立つイベントバインディングコンプリートがあります。

データバインディングでフォーマットを有効にすることを忘れないでください。それがなければイベントは発生しません。

https://msdn.microsoft.com/en-us/library/k26k86tb(v=vs.100).aspx

データバインディングの目的は、グラフィカルコントロールプロパティに「リンク」ビジネス・オブジェクト・プロパティであるように、隠されたコントロールが見えるようになるまで、制御値を「読み取る」ことはありません。 UIコントロールのプロパティを読み取るのではなく、ビジネスデータバインドオブジェクトに直接アクセスする必要があります。

このイベントでスローされた例外は、Winformsによって暗黙にキャッチされているため、Try Catchを使用してLoadをラップすることも(いずれの場合も)良いことです。これにより、フォームをロードし、 "ローディングプロセスコード"の半分だけで表示することができます。

+0

無効なプロパティにデータバインディングをテストするだけで簡単にできます: 'this.DataBindings.Add(new System.Windows。 * System.ArgumentException:DataSourceのプロパティまたは列XXXXXXにバインドできません。 パラメータ名:dataMember * –

+0

どうしたらいいですか?Forms.Binding( "Text"、this、 "XXXXXX"、true)); IListのdataオブジェクトが初期化される前にバインディングを作成した場合(例:デザイナーでexemple?)、またはソースのタイプが変更された場合、この場合は例外はスローされません。 –

+0

'Argu mentExceptionがスローされます。フォームのconstrutorメソッドと 'OnLoad'メソッドに' try ... catch'を追加しました。例外はまだスローされません。 –

関連する問題