3

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 サーバーを使用しています。

前もって感謝します

ウェス

4

5 に答える 5

2

今日も同様の問題があり、これが機能することがわかりました。

private void btnCancel_Click(object sender, EventArgs e)
{
    this.MyTable.RejectChanges();
    this.txtMyBoundTextBox.DataBindings[0].ReadValue();
    this.EditState = EditStates.NotEditting;
}
于 2011-01-19T21:21:37.523 に答える
1

まず、この投稿には整理が必要です。回答が順番に保持されていないことを覚えておいてください。順番は投票で決まる。

したがって、追加の質問がある場合は、元の質問を変更してください (混乱を避けるために「編集」とマークしてください)。

役立つと思う回答に賛成票を投じます。

ところで、コード サンプルを含めるときは、コード サンプル ボタン (編集ウィンドウの上) を使用してください。これにより、構文の強調表示を含むコードの適切な書式設定が得られます。

要点: 両方の質問の根本的な問題は、Binding-Manager が元のオブジェクトへのリンクを保持していることです。

_ds を DataSource として割り当てると、Binding-Manager は DataSet を分析し、それに応じて動作します。他の DataSet を _ds に割り当てた場合、Binding-Manager はこれを知る方法がありません。元の DataSet オブジェクトへの参照がまだ残っています。したがって、これは、DataSource プロパティを新しい DataSet にリセットする必要がある理由を説明しています。

また、テーブルの削除と追加が期待した結果につながらない理由についても説明します。ここでも、Binding-Manager は古いテーブル (またはそのテーブルの最初の行) への参照を保持します。新しいテーブルはバインドされません。また、この場合、_ds は以前と同じ DataSet オブジェクトを指しているため、_ds の再割り当ては役に立ちません。Binding-Manager は、それが同じオブジェクトであり、再バインド アクションを行わないことに気付くほどスマートです。

バインドされたオブジェクトのコンテンツを変更する (Binding-Manager がサブスクライブする PropertyChanged-Event を起動する) か、別のオブジェクトを DataSource プロパティに割り当てて完全な再バインドをトリガーする必要があります。

これは実際に何が起こるかを簡単に説明したものですが、問題を説明して解決するのに十分であることを願っています。残念ながら、Web (または他の場所) で WinForms データバインディングの包括的な説明をまだ見つけていません。

于 2008-11-05T15:23:55.053 に答える
0

ウェス、私は私が助けることができてとてもうれしいです。野生で理解するのに何週間もかかったあなたと非常によく似た問題を今でも覚えています...

あなたの質問に関して、私が知っているのはこれだけです:

  1. 最初にDataSourceを設定し、次にDataMemberを設定すると、DataMemberを設定すると既存の(有効な)バインディングが変更されるため、データソースは2回スキャンされます。逆の場合、最初にDataMemberを設定し(DataSourceがnull以上の場合、typeof(YourData))、データソースを設定したときにバインドが1回だけ行われます。

  2. ここでも同じ解決策を適用できると思います。ただの代わりに

    bindsrcContract.DataSource = _ds;
    

    最後の行に、次のように書く必要があります

    bindsrcContract.DataSource = typeof(System.Data.DataSet);
    bindsrcContract.DataSource = _ds;
    
  3. がっかりさせて申し訳ありませんが、MSDNからデータバインディングと試行錯誤について知っていることをすべて学びました。かなり辛かったです。うまくいけば、他の誰かが便利なリンクを1つか2つ使ってチャイムを鳴らすことができます。

于 2008-10-29T20:29:06.880 に答える
0

他のすべてに失敗した場合は、次のようにして、新しいデータセットを受け取るたびに DataSource を再割り当てできます。

bindsrcContract.DataSource = typeof(System.Data.DataSet);
bindsrcContract.DataSource = _ds;

(また、最初に DataMember を初期化し、次に DataSource を初期化すると、パフォーマンスが向上します。)

于 2008-10-28T21:44:58.693 に答える