BindingSource オブジェクトを使用している Windows フォーム コントロールの更新に問題があります。リモート サーバー上で実行されている WCF サービスと対話する CAB/MVP/SCSF クライアントを私 (チームの取り組みであるため、実際には「私たち」) が開発しています。(これは私たちの最初の試みなので、学習モードにあります)。サービスへの (プレゼンターからの) 呼び出しの 1 つは、「Contract」、「Loan」、および「Terms」という名前の 3 つの DataTable を含む DataSet を返します。各テーブルには 1 つの行のみが含まれます。サービスがデータセットを返すと、BindData() というビューで関数を呼び出し、データセットをプレゼンター クラスからビューに渡すことにより、SmartPart/View のクラス メンバー変数にデータセットを格納します。
private System.Data.DataSet _ds = null;
public void BindData(System.Data.DataSet ds)
{
string sErr = "";
try
{
_ds = ds; // save to private member variable
// more code goes down here
}
}
3 つの DataTable のそれぞれを Windows Forms TextBoxes、MaskedEditBoxes、および Infragistics UltraComboEditor Dropdown コンボボックスの組み合わせにバインドしようとしています。VS2008 IDE を使用して、DataTable ごとに 1 つずつ、3 つの BindingSource オブジェクトを作成しました。
private System.Windows.Forms.BindingSource bindsrcContract;
private System.Windows.Forms.BindingSource bindsrcLoan;
private System.Windows.Forms.BindingSource bindsrcTerms;
このように値をバインドしています
if (bindsrcContract.DataSource == null)
{
bindsrcContract.DataSource = _ds;
bindsrcContract.DataMember = “contract”;
txtContract.DataBindings.Add(new Binding("Text", bindsrcContract, "contract_id", true));
txtLateFeeAmt.DataBindings.Add(new Binding("Text", bindsrcContract, "fee_code", true));
txtPrePayPenalty.DataBindings.Add(new Binding("Text", bindsrcContract, "prepay_penalty", true));
txtLateFeeDays.DataBindings.Add(new Binding("Text", bindsrcContract, "late_days", true));
}
if (bindsrcLoan.DataSource == null)
{
bindsrcLoan.DataSource = _ds;
bindsrcLoan.DataMember = “loan”;
mskRecvDate.DataBindings.Add(new Binding("Text", bindsrcLoan, "receive_date", true));
cmboDocsRcvd.DataBindings.Add(new Binding("Value", bindsrcLoan, "docs", true));
}
これは、サービスから最初の読み取りを行い、データセットを取得するときに機能します。情報はフォームのコントロールに表示されます。フォームを使用して情報を更新し、変更された値を WCF サービスに戻すことで「保存」できます。
これが私たちの問題です。別のローン キーを選択し、同じサービスを呼び出して新しい DataSet を取得すると、それぞれ 1 行の 3 つのテーブルがあり、コントロール (テキスト ボックス、マスクされた編集ボックスなど) は新しい情報で更新されません。 . smartPart/View は閉じられていませんが、サービスへの呼び出しの間にロードされたままになっていることに注意してください。2 番目の呼び出しでは、呼び出しを再バインドするのではなく、更新された DataSet からデータを更新しようとしているだけです。
考えられることはすべて試しましたが、明らかに何かが欠けています。これは、BindingSource コントロールを使用する最初の試みです。私たちは試しました
bindsrcContract.ResetBindings(false);
と
bindsrcContract.ResetBindings(true);
と
bindsrcContract.RaiseListChangedEvents = true;
と
for (int i = 0; i < bindsrcContract.Count; i++)
{
bindsrcContract.ResetItem(i);
}
DataMember プロパティを再度リセットするだけでなく、
bindsrcContract.DataMember = ”Contract”;
多くの例を見てきました。多くの例で BindingNavigator を参照していますが、DataTable には行が 1 つしかないため、それが必要だとは考えていませんでした。グリッドの例はたくさんありますが、ここでは使用しません。どこが間違っているのか、またはより多くの情報を提供するリソースを教えてください。
VisualStudio 2008、C# および .Net 2.0、XP クライアント、W2K3 サーバーを使用しています。
前もって感謝します
ウェス