2011-08-08 6 views
0

私は、別のクラス 'MyData'のプロパティにバインドされたテキストボックスを持つウィンドウフォーム 'MyForm'を持っています。データソース更新モードが「プロパティ変更時」に設定されている別のクラスのプロパティにバインドされたテキストフィールドは更新されません

私はVisualStudio IDEを使用しました。これは後に初期化値コードがINotifyPropertyインタフェースが実装された

myDataClassInstantiated = new MyDataClass(); 
BindingSourceMyDataClass.DataSource = myDataClassInstantiated; 

形にのMyDataクラスを結合するために加え、フォームコンストラクタで結合

this.txtYield.DataBindings.Add(new Binding("Text", this.BindingSourceMyDataClass, "PropertyInMyDataClass", true, DataSourceUpdateMode.OnPropertyChanged)); 

ために、次のコードを作成した:

public double PropertyInMyDataClass 
{ 
    get { return _PropertyInMyDataClass; } 
    set 
    { 
     if (!Equals(_PropertyInMyDataClass, value)) 
     { 
      _PropertyInMyDataClass = value; 
      FirePropertyChanged("PropertyInMyDataClass"); 
     } 
    } 
} 

バックグラウンドワーカーを使用して計算を実行し、 'PropertyInMyDataClass'プロパティを更新します。

バックグラウンドワーカーが完了すると、フォームのテキストボックスが自動的に更新されることが予想されました。私は手動でフォームのテキストボックスにプロパティから値を割り当てるコピーする場合それは

を実現しなかった、値が正しく表示され

this.txtYield.Text = String.Format("{0:F0}", myDataClassInstantiated.PropertyInMyDataClass); 

は私がにリフレッシュ()とupdate()を追加しようとしましたMyForm.MyBackgroundWorker_RunWorkerCompletedメソッドが、データはまだ更新されません。私は後で同じフォーム上の別のテキストボックスを更新異なるバックグラウンドワーカーを実行する場合

は、PropertyInMyDataClassにバインドされたテキストボックスは、私が理解し、このデータバインディングの問題を解決するために私を助ける提案をいただければ幸いです

に更新されます

答えて

0

問題はいくつかの角度から来ています。バックグラウンドスレッドでプロセスを実行している場合、バックグラウンドスレッドはフォーム上のコントロール(別のスレッドに存在する)に直接アクセスすることはできません。そうしないと、例外が発生します。バックグラウンドスレッドの状態に基づいてUIスレッドが更新されることを期待することはできません。これを行うには、メインのUIスレッドで代理人を呼び出す必要があります。

UIフォームにこのコードを配置します(任意の値タイプで必要なコントロールを更新するように変更します)。

public void UpdateOutput(string text) 
    { 
     this.Invoke((MethodInvoker) delegate { 
      lstOutput.Items.Add(text); 
     }); 
    } 

この関数をバックグラウンドワーカースレッドで呼び出すことができます。 (あなたのバックグラウンドプロセス関数は同じフォームに存在すると仮定して直接呼び出すことができます)、そうでなければ、バックグラウンドプロセスが実行されるクラスのUIフォームへの参照が必要です。

+0

Thanks @David C. Iこのフォームに約15フィールドの更新が必要で、UIスレッドでBackgroundWorkker_RunWorkerCompletedが呼び出されるまで待つことができます。あなたのコードはこれに対処する適切な方法です。バックグラウンドワーカーがフィールドの更新を完了するまで待つことができれば、リフレッシュを開始する方法がありますか? – DarwinIcesurfer

+0

@Darwinバックグラウンドワーカーへの呼び出しをどのように構造化し、データオブジェクトにデータを取り込みますか?データオブジェクトは静的であるか、それとも類似していますか? –

+0

データオブジェクトは静的ではありませんが、バックグラウンドワーカープロセスが終了するまでデータは有効ではありません。クラスには計算に使用される多数の入力プロパティがあり、計算が終了した後にフォーム上で更新する必要がある多数の結果があります。おそらくデータバインディングが原因で私はそれが修正されるより多くの問題を引き起こしています。 – DarwinIcesurfer

関連する問題