4

问题。对于表单本身的大量文本框,我对表单上的属性中的字段进行了数据绑定。我不仅要更改属性中的字段值,还要更改整个属性(重置为以前保存的默认值)。

我想做的是这样的:

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

不起作用,BindingContext[Row]是 a PropertyManager,不是 a CurrencyManager,并且没有刷新方法。 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
}

更新 我将数据绑定设置为完整的数据绑定字符串,以查看设置空值默认值是否有任何效果,它没有。

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

Row是表单本身的公共属性。 ResetRow是表单上的私有属性,它分配给表单加载上初始行的克隆并且从未更改,它用作备份。 某些属性(但不是全部)的值允许为空,并且应显示为空字符串。这就是 NullableBinding 类在幕后所做的

谁能想到比删除和重新应用每一个数据绑定更好的方法?

4

2 回答 2

7

假设您要绑定的对象保持不变,使用Binding.ReadValue可能会省去解除绑定和重新绑定的麻烦,但这并没有好多少:

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

另一方面,如果您正在更改底层绑定对象,这将不起作用。我建议在s 和objectBindingSource之间放置一个,这样你只需要重新绑定绑定源,而不是单独绑定所有 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 回答