【问题标题】:Validating binding, depending on which button is clicked验证绑定,取决于单击的按钮
【发布时间】:2017-07-25 15:15:14
【问题描述】:

我搜索了很多,但没有找到合适的解决方案。

我有一个TextBoxDataGridView、3 个Buttons 和一个BindingSource

当我点击我的Button“更改”时,我设置了绑定,并且数据从DataGridView 加载到TextBox,这是有效的:

textBox.DataBindings.Add("text", bindingSource, "Name", true, DataSourceUpdateMode.OnPropertyChanged);

当我现在点击Button“取消”时,绑定将被清除:

textBox.DataBindings.Clear();

但数据仍会传输到DataGridView。我认为这是因为OnPropertyChanged。当我将其更改为 OnValidation 时,我知道它只会在经过验证后才会保存。

但是我怎样才能验证它或拒绝验证呢?我有2个Buttons,根据点击“保存”按钮还是“取消”按钮,应该转移到DataGridView

还有活动

textBox.Validating += textBox_Validating;

我没有让它运行,因为在我点击按钮之前调用了这个函数。

我怎样才能做到这一点?

【问题讨论】:

    标签: c# .net winforms datagridview bindingsource


    【解决方案1】:

    您可以使用DataSourceUpdateMode.Never 创建绑定并将其存储在表单级变量(字段)中。然后您可以使用WriteValue 方法应用更改(分别ReadValue 恢复更改)。

    类似这样的:

    表格:

    Binding nameBinding;
    

    更改按钮点击:

    nameBinding = textBox.DataBindings.Add("Text", bindingSource, "Name", true, DataSourceUpdateMode.Never);
    

    取消按钮点击:

    nameBinding.ReadValue();
    textBox.DataBindings.Clear();
    nameBinding = null;
    

    保存按钮点击:

    nameBinding.WriteValue();
    textBox.DataBindings.Clear();
    nameBinding = null;
    

    【讨论】:

    • 谢谢,效果很好 :) 我现在使用 List,因为我有更多控件,并且通过 foreach 我可以读取或写入所有值。
    • 嗨 Ivan:现在我找到了接口 IEditableObjectBeginEditCancelEditEndEdit。这和ReadValueWriteValue 类似吗?
    • 嗨@Beetee,不完全是。首先,它要求您的对象实现该接口。 BeginEdit 的实现应该以某种方式将所有属性值存储在某处,以便在调用 CancelEdit 时能够恢复它们。而上述技术没有这样的要求,因为它将新值保留在控件中,并且仅在特别请求时才更新数据源。
    • 好的,所以上面的解决方案几乎相同,但配置工作更少?!
    • 嗯,虽然这两种方法的作用几乎相同,但它们的作用却截然不同。 (1) BeginEdit:IEditableObject 应该创建和存储属性值的快照;上述方案不需要任何动作 (2) CancelEdit:IEditableObject 应该恢复属性值并释放快照,绑定的控件会自动更新;上述解决方案需要手动强制控件重新读取值 (3) EndEdit: IEditableObject 必须释放快照。不需要控制操作(因为控制包含最新数据);以上解决方案需要手动..
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多