datasource绑定到用户属性时更新

时间:2012-09-04 16:30:46

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

C#,VS-2010,winforms

通常我想用可绑定的MyProperty创建用户控件。但是我遇到了一些问题:当前行改变时数据行被修改。

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

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

  1. 使用
    创建测试表单
    • dataGridView(将其设置为ReadOnly),
    • 文本框,
    • 某些类型的DataSet和一些Table
    • 的BindingSource
  2. 将bindingSource绑定到表
  3. 将dgv绑定到bindingSource
  4. 将TextBox.Text绑定到bindingSource到某个文本列(“name”)
  5. 在表单加载表上包含一些数据。 (如果手动添加行,请不要忘记AcceptChanges())
  6. 为表xxx_ColumnChanging(...)添加事件处理程序并在那里设置断点
  7. 所有标准步骤,没什么特别的

    生成

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

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

    生成

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

    当使用带有虚拟属性的UserControl

    时,而不是textBox也是如此

    String MyProperty {set;得到; }

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

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

1 个答案:

答案 0 :(得分:2)

简短回答是:

绑定到simple属性时,声明为

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

然后数据源将更新当前位置更改。您可以将其视为Bug或功能......

改变行为 - 我需要魔术词。在控件中声明事件为

 public event System.ComponentModel.PropertyChangedEventHandler MyPropChanged;

此名称很特别: “YourPropertyName”+“已更改” = 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"));
}    

以下是包含更多详细信息的示例项目,其中我使用String属性创建用户控件 ValueTwo 它使用一些自定义逻辑分成两个不同的TextBox,并在用户更改文本时组合值和更新。

test_bind_fixed.zip

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