4

問題。フォーム自体の多数のテキストボックスのフォームのプロパティ内のフィールドにデータバインディングがあります。プロパティ内のフィールド値だけでなく、プロパティ全体を変更しています(以前に保存したデフォルトにリセットします)。

私がやりたかったのは次のようなものでした。

((CurrencyManager)BindingContext[Row]).Refresh();

動作せず、でBindingContext[Row]あり、ではPropertyManagerなくCurrencyManager、refreshメソッドがありません。 PushData()保護されており、アクセスできません。私も呼び出してみthis.Refresh()ました、そして私が呼び出してみた各コントロールで個別にc.Refresh...今何ですか?

現在使用しているコードは次のとおりです。

private void btnReset_ButtonClicked(object sender, EventArgs e)
{
    Row = ResetRow.Clone();//use clone to break the reference, dont want to be updating the ResetRow when Row fields change.

    foreach (Control c in pnlBody.Controls)
        if (c.DataBindings.Count > 0)
            c.DataBindings.Clear();

    DataBindandSet();//re-apply all the databindings (50)
}

//just a sample of the databinding function itself
private void DataBindandSet()
{
    txtAzimuth.DataBindings.Add(new NullableBinding("Text", Row, "Azimuth", true));
    txtBHTemp.DataBindings.Add(new NullableBinding("Text", Row, "BHTemp", true));
    //repeat 48 more times
}

更新 データバインディングを完全なデータバインディング文字列に設定しました。null値のデフォルトを設定しても効果があるかどうかを確認しましたが、効果はありませんでした。

txtAzimuth.DataBindings.Add(new NullableBinding("Text", Row, "Azimuth", true, DataSourceUpdateMode.OnPropertyChanged, ""));

Rowフォーム自体の公共財産です。 ResetRowフォームのプライベートプロパティであり、フォームロードの最初の行のクローンに割り当てられ、変更されることはありません。バックアップとして機能します。 一部のプロパティ(すべてではない)の値はnullであることが許可されており、空の文字列として表示される必要があります。これは、NullableBindingクラスが舞台裏で行うことです

データバインディングをすべて削除して再適用するよりも、これを行うためのより良い方法を誰かが考えることができますか?

4

2 に答える 2

7

バインドするオブジェクトが同じままであると仮定すると、使用Binding.ReadValueすることでバインド解除と再バインドの手間を省くことができます。

foreach (Control c in pnlBody.Controls)
    foreach (Binding b in c.DataBindings)
        b.ReadValue();

一方、基になるバインドされたオブジェクトを変更する場合、これは機能しません。sとオブジェクトのBindingSource間に置くことをお勧めします。この方法では、バインディングソースを再バインドするだけでよく、50個すべてのバインディングを個別にバインドする必要はありません。データソースへの呼び出しまたはデータソースのリセットのいずれかによって:BindingRowBindingSource.CancelEdit()

RowBindingSource.DataSource = null;
RowBindingSource.DataSource = this.Row;
于 2013-02-18T17:15:32.930 に答える
0

これを試してください:TableAdapter.Fill(dataTable)

私の例:this.bankingaccountTableAdapter.Fill(this.bankDataSet.bankingaccount);

于 2016-02-03T01:59:31.907 に答える