2011-07-30 10 views
2

ハードウェアデバイスを構成する.NET 4.0 WinFormsアプリケーションを作成しています。たとえば、デバイスに設定可能な10の設定があるとします。デバイスは、5つの異なる構成を記憶することもできる。そこで、10の設定を定義する設定オブジェクトを作成しました。私のフォームのコンストラクタでは、5つの構成オブジェクトの配列を作成し、その配列をコンボボックスのデータソースとして設定しています。ユーザーはコンボボックス(ドロップダウンリスト)から設定を選択し、その設定の設定がUIに表示されます。ユーザーがコンボボックス経由で別の設定を選択したときは、新しく選択した設定オブジェクトの設定を表示する前に、UIのすべての設定が現在の設定オブジェクトで更新されていることを確認する必要があります。私は現在、コンボボックスのSelectedIndexChangedイベントハンドラでこれを行っています。ユーザーが設定を変更すると、5つの設定すべてをハードウェアデバイスに書き込むボタンがクリックされます。問題の原因はここにあります。たとえば、3番目の設定を選択し、UIの設定を変更してから書き込みボタンをクリックすると、3番目の設定オブジェクトに保存されている設定はまだ更新されていないため、UIに反映される設定は得られませんデバイスに書き込まれます。私は、この問題を解決するためにいくつかの方法を考えてきました:デザインの質問re:.NETコンボボックスをオブジェクトの配列にバインドする

書き込み設定]ボタンのClickイベントで
  1. 、私は常に、現在の設定で適切な設定オブジェクト内のデータを更新する新しいコードを書くことができ5つの設定すべてのデータをデバイスに書き込む前に、UIに保存してください。

  2. 書き込み設定ボタンのClickイベントでは、コンボボックスのSelectedIndex値をプログラムによって設定して、SelectedIndexChangeイベントハンドラをトリガすることで、設定オブジェクトを再表示する前にその設定を書き込むことができます。それから、すべての設定をデバイスに書き込むことができました。

私はどちらかは、おそらく最大の違いは、すでに私は#2のために必要な機能が含まれている既存のイベントハンドラをtriggerring対#1のための新しいコードを書くされた状態で動作すると思います。しかし、これについてもっと考えればするほど、このようなことを行うための「正しい」方法として一般的にみなされていることが増えます。誰にもこれに関する考えや考えがありますか?どうもありがとう!

答えて

1

あなたはBindingSourceを使用していないようですが、必要以上に多くの作業を行っている可能性があります。

WinFormsでデータバインディングを使用する場合、一般的な要件を満たすために、言及したイベントのほとんどを使用する必要はありません。

まず、BindingSourceに慣れていない場合は、それをお読みください。

これは、あなたがそれを設定する必要がありますどのようにある:あなたのConfigurationクラス(10回の設定で1)から新しいデータソースを作成し、フォームデザイナで

  • を。

  • フォームにBindingSourceコンポーネントを追加します。

  • BindingSourceのDataSourceプロパティを、作成したばかりの新しいDataSourceに設定します。

  • ComboBox DataSourceをBindingSourceに設定します。

  • ComboBox DisplayMemberをBindingSourceの適切な記述プロパティ(これは設定クラスを表す)に設定します。

  • 10個のテキストボックスのテキストプロパティをBindingSourceの10個の設定プロパティにバインドします。

  • 実行時に、BindingSourceのDataSourceプロパティを5つの構成オブジェクトを含む配列に設定します。

この段階では、データバインディングを行っています。 UIを使用して一部の設定を変更すると、その変更がデータソース(配列)に反映されます。

(動作していない、または奇妙な動作をしている場合は、現在実行中のイベント処理を削除する必要があります) ユーザーが行った変更が書き込まれるようにANYコードを書く必要はありませんデータソースに追加します。それは自動的に起こります。あなたはちょうどどこかのデータを永続化するコードを書く必要があります。

デフォルトでは、テキストボックスのフォーカスが失われ、CausesValidation = trueの別のコントロールがフォーカスを取得した場合にのみ、各設定変更がアレイに反映されます。したがって、「設定を書き込む」ボタンにCausesValidation = true(デフォルト)が設定されている場合、そのクリックイベントを処理するときに、配列には最新のすべてのデータが格納されます。

バインドのUpdateModeをOnPropertyChangedに変更することで、データソースにすぐ反映される設定テキストボックスに変更を加えることができます。デフォルトはOnValidationで、フォーカスがCausesValidation = trueの別のコントロールに移動するまでではありません。

もう一つは、その後、私は(私はあなたが既に知っているすべてを伝える可能性があります知っているので)今のために停止するつもりです:

は、あなたの設定クラスがINotifyPropertyChangedを実装することを検討してください。その後、PropertyChangedイベントを処理して、ユーザーが変更を入力したときに検証を実行できます。また、コントロールのValidatingイベントを処理することもできます。

あなたはすでに上記のすべてを知っていれば間違った前提を犯したことをお詫び申し上げます。あなたの質問から、あなたはまだWinFormsのデータバインディングを完全に発見していないという印象を受けます。

+0

チャールズ - 私はBindingSourceを使用していなかったことは間違いありませんでした(私は今ですが、!-))。実際、あなたの優れた反応を読んだ後、私はデータ結合の理解がどれほど浅いかを理解しています。しかし、あなたは私のためにたくさんの光を放ってきました。そして、私は数日後にこの問題を解決するために私のアプリを再設計しています。ありがとうございました!私はあなたの助けに非常に感謝します。 – user685869

+0

ようこそ。 :) –

0

あなたのComboBox_SelectIndexChangedWriteButton_Clickの両方のイベントでは、同じUpdateConfigurationメソッドを呼び出すことになりました。これにより、必要に応じて常に新しい設定が保存されます。