0

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 时,也会发生同样的情况

字符串 MyProperty { 设置;得到; }

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

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

4

1 回答 1

2

简短的回答是:

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

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

然后数据源将根据当前位置变化进行更新。您可以将其视为错误或功能...

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

 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创建用户控件, 该控件使用一些自定义逻辑拆分为两个不同的 TextBox,并在用户更改文本时组合值和更新。

test_bind_fixed.zip

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

于 2012-09-11T17:13:35.443 回答