【问题标题】:datasource Updating when bind to user property绑定到用户属性时更新数据源
【发布时间】:2012-08-29 08:43:25
【问题描述】:

C#、VS-2010、winforms

一般来说,我想使用可绑定的 MyProperty 创建用户控件。但是我遇到了一些问题:当前行更改时数据行被修改。

您可以下载 C# 项目并自己尝试: test_bind.zip

为了简单起见,我确实遵循了:

  1. 使用
      创建测试表单
    • dataGridView(设置为只读),
    • 文本框,
    • 一些类型化的数据集和一些表
    • 绑定源
  2. 将 bindingSource 绑定到表中
  3. 将 dgv 绑定到 bindingSource
  4. 将 TextBox.Text 绑定到 bindingSource 到某个文本列(“名称”)
  5. 在带有一些数据的表单加载填充表上。 (如果您手动添加行,请不要忘记 AcceptChanges())
  6. 为表 xxx_ColumnChanging(...) 添加事件处理程序并在此处设置断点

都是标准步骤,没什么特别的

运行

如预期 - dgv 中的行,文本框中的当前名称,单击网格中的不同行... 只有当我修改文本框中的文本时,我才会在断点处停止。

让我们修改程序,并将 textBox 绑定到不同的属性而不是 Text - 比如说 Tag。 将 DataSourceUpdateProperty 设置为“OnValidation”或“OnPropertyChanged”。

运行

现在当前行被修改。 !!!

当我使用带有虚拟属性的 UserControl 而不是 textBox 时,也会发生同样的情况

String MyProperty { 设置;得到; }

如何将用户控件中的自定义属性与与TextBox.Text的行为相同?

注意: 绑定属性本身不是问题。问题是:当我绑定到标准 TextBox.Text 属性时 - 一切都好文我绑定到任何其他属性(标签)或用户控件中的自定义属性 - 然后 DATASOURCE 总是为当前行修改

【问题讨论】:

  • 您是否在询问如何在您的 UserControl 上绑定一个属性 - 在幕后绑定到该 UserControl 上的 TextBox?
  • 绑定属性本身没有问题。问题是:当我绑定到标准 TextBox.Text 属性时 - 一切都好文我绑定到任何其他属性(标签)或用户控件中的自定义属性 - 然后 DATASOURCE 总是为当前行修改

标签: c# winforms data-binding binding user-controls


【解决方案1】:

简短的回答是:

当绑定到简单属性时,声明如下

[Bindable(true, BindingDirection.TwoWay)]           //  I need TwoWay    
public String MyProp {set;get;}

然后数据源将在当前位置更改时更新。你可以把它算作 Bug 或 Feature...

要改变行为 - 我需要神奇的词。将控件中的事件声明为

 public event System.ComponentModel.PropertyChangedEventHandler MyPropChanged;

这个名字很特别:"YourPropertyName" + "Changed" = YourPropertyNameChanged 其他词不会是魔术。 一旦事件声明 - 数据源不会像以前那样每次都更新......

现在我可以控制这个过程了……

public void OnMyPropChanged(System.ComponentModel.PropertyChangedEventArgs e)
{
    Binding bb = this.DataBindings[0] as Binding;
    bb.WriteValue();
    if (MyPropChanged != null) MyPropChanged(this, e);
}

private void TxtChanged(object sender, EventArgs e)
{
    if (load) { return; }
    _my_prop = Txt.Text;   // ...
    OnValueTwoChanged(new PropertyChangedEventArgs("MyProp"));
}    

这是一个包含更多细节的示例项目,我在其中使用字符串属性 ValueTwo 创建用户控件 它使用一些自定义逻辑拆分为两个不同的文本框,并在用户更改文本时组合值和更新。

test_bind_fixed.zip

这是对我有帮助的文章 http://support.microsoft.com/kb/327413

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2014-09-08
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2016-09-23
    相关资源
    最近更新 更多