【发布时间】:2017-08-22 07:53:33
【问题描述】:
我有一个实体,例如客户继承自IEditableObject,就像描述的here:
public class Customer : IEditableObject
{
...
private Boolean backupAvailable = false;
private ThisObject backupData;
public void BeginEdit()
{
if (!backupAvailable)
{
this.backupData.Name = this.Name;
backupAvailable = true;
}
}
public void CancelEdit()
{
if (backupAvailable)
{
this.Name = this.backupData.Name;
backupAvailable = false;
}
}
public void EndEdit()
{
if (backupAvailable)
{
backupData = new ThisObject();
backupAvailable = false;
}
}
}
在我的 UI 类中,我有一个 BindingSource,所有控件都绑定到其中,还有 2 个按钮“更改”和“取消”:
BindingSource BSCustomer;
private void buttonChange_Click(object sender, EventArgs e)
{
...
((Customer)BSCustomer.Current).BeginEdit();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
...
((Customer)BSCustomer.Current).CancelEdit();
}
这很好用。
但现在我发现,BeginEdit() 不仅是从我的显式调用中调用的,而且是从许多其他代码中调用的,例如:
BSCustomer.AllowNew = true;
或
BSCustomer.AddNew();
或
BSCustomer.IndexOf();
当我现在单击“更改”按钮时,backupAvailable 已经设置了错误的值。当我点击“取消”时,错误的值被写回。
有没有办法阻止这种调用?或者我可以在BeginEdit() 的呼叫来源中有所不同吗?
【问题讨论】:
-
嗨,恐怕这是“设计使然”,即在 WF 数据绑定基础架构中的许多地方都调用了
BeginEdit,以“以防万一”。这就是需要bool标志的原因。如果您想准确控制何时调用BeginEdit、CancelEdit和EndEdit,请保持Customer类方法不变,但不要实现IEditableObject(删除: IEditableObject)。跨度> -
你是对的。我创建了一个 DataGridView - BindingSource - BindingList - IEditableObject 链,并注意到在 BindingSource 初始化期间,BindingList 的第一个元素的 BeginEdit 被多次调用。未调用 EndEdit / CancelEdit。使用键盘在 DataGridView 中移动(不是编辑!)也会导致 BeginEdit 被多次调用,而没有 EndEdit / CancelEdit。显然这些函数不能用于创建撤销功能的可信度
-
嗨,Ivan,删除
IEditableObject成功了。现在BeginEdit()只是在我手动调用它时被调用。谢谢。
标签: c# winforms binding ieditableobject