4

背景: 2 つのテキスト ボックスを持つフォームがあります。各テキスト ボックスは、型指定されたデータセットの同じフィールドにバインドされます。

ビジュアル スタジオ デザイナーを使用して、各テキスト ボックスの Text プロパティをバインドします。InitializeComponent() メソッドで生成されたコードは次のようになります...

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.testDataSet1, "TestTable.TestID", true));

これまでのところ非常に基本的です。ここで、クリック イベントが型指定されたデータセットに行を追加するボタンを追加します。これを行うと、2 つのデータ バインド テキスト ボックスに最初の行が表示されます。単純なクリック イベントは次のようになります。

private void button1_Click(object sender, EventArgs e)
    {
        this.testDataSet1.TestTable.AddTestTableRow(nTestID++, "Test" + nTestID.ToString());
    }

データセットの行間でデータバインドされたフィールドを移動したいことがわかりました。これを行うには、単純に BindingManagerBase オブジェクトを作成し、フォームの BindingContext プロパティに存在する BindingManagerBase オブジェクトを取得します。

private BindingManagerBase currentMgr = null;

フォームコンストラクターでは、次のことを行います

this.currentMgr = this.bc[this.testDataSet1, "TestTable"];

次に、コード内の他の場所で currentMgr を使用して次のレコードに移動できます。

this.currentMgr.Position++;

はい、これはすべて基本です!

問題:今、私が理解していない部分については、ヘルプを使用できます...

テキスト ボックスの 1 つに DataSet とは異なる行を表示する機能が必要だとします。ああ、これは簡単なはずです。

新しい BindingContext を作成し、最初のテキスト ボックスの BindingContext プロパティをこの新しい BindingContext に割り当てます。次に、この新しい BindingContext に存在する BindingManagerBase オブジェクトを取得し、それを使用して行をナビゲートします。

問題は、新しい BindingContext を作成し、それをテキスト ボックスの BindingContext プロパティに割り当ててから、データを DataSet にロードすると、テキスト ボックスにテキストSystem.Data.DataRowViewが表示されることです。

コードは次のようになります。非常に単純です。

    private BindingContext bc;
    private BindingManagerBase currentMgr = null;
    private BindingManagerBase currentMgr2 = null;

    public Form1()
    {
        InitializeComponent();

        this.bc = new BindingContext();
        this.textBox1.BindingContext = this.bc;

        this.currentMgr = this.BindingContext[this.testDataSet1, "TestTable"];
        this.currentMgr2 = this.bc[this.testDataSet1, "TestTable"];
    }

このコードをデバッグしてthis.BindingContext[this.testDataSet1,"TestTable"] (フォームの bindingcontext) とthis.bc[this.testDataSet1,"TestTable"]を見ると、どちらも RelatedCurrencyManager オブジェクトを返します。

これらのバインディング コンテキストの両方が同様の (明らかに同じではない) RelatedCurrencyManager オブジェクトを返す場合、新しい BindingContext にバインドされたテキスト ボックスにテキストSystem.Data.DataRowViewが表示され、データセットからのデータが表示されないのはなぜですか?

デバッガーで各 RelatedCurrencyManager オブジェクトを何度も調べて、1 つのプロパティが他の RelatedCurrencyManager オブジェクトと異なるかどうかを確認しましたが、すべてが同じように見えます :-(.

フォーム BindingContext が作成され、新しい BindingContext とは異なる時間に初期化されることはわかっています。それが私の問題だと思いますが、この問題を特定することはできません。

どんな洞察もいただければ幸いです!

ありがとう、

4

0 に答える 0