【问题标题】:Prevent IEditableObject.BeginEdit() is called multiple times防止 IEditableObject.BeginEdit() 被多次调用
【发布时间】: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 标志的原因。如果您想准确控制何时调用BeginEditCancelEditEndEdit,请保持Customer 类方法不变,但不要实现IEditableObject(删除: IEditableObject)。跨度>
  • 你是对的。我创建了一个 DataGridView - BindingSource - BindingList - IEditableObject 链,并注意到在 BindingSource 初始化期间,BindingList 的第一个元素的 BeginEdit 被多次调用。未调用 EndEdit / CancelEdit。使用键盘在 DataGridView 中移动(不是编辑!)也会导致 BeginEdit 被多次调用,而没有 EndEdit / CancelEdit。显然这些函数不能用于创建撤销功能的可信度
  • 嗨,Ivan,删除 IEditableObject 成功了。现在BeginEdit() 只是在我手动调用它时被调用。谢谢。

标签: c# winforms binding ieditableobject


【解决方案1】:

只需删除 :IEditableObject 即可解决。没有它,BeginEdit() 只会在手动调用时被调用。

Ivan 的所有功劳。

【讨论】:

    【解决方案2】:

    我也不得不处理这种情况。谢谢伊万,他们帮助解决了这个问题。 结果,我用ICloneable做了这样的事情。

    public class Customer : ICloneable
    {
        struct ThisObject 
        {
            internal string guid;
            internal string name;
        }
    
        private Boolean backupAvailable = false;
        private ThisObject backupData;
        private ThisObject currentData;
    
        public void BeginEdit()
        {
            if (!backupAvailable)
            {
                var tempCustomer = (Customer)this.Clone();
                this.backupData = tempCustomer.currentData;
                backupAvailable = true;
            }
        }
    
        public void CancelEdit()
        {
            if (backupAvailable)
            {
                this.currentData = backupData;
                backupAvailable = false;
            }
        }
    
        public void EndEdit()
        {
            if (backupAvailable)
            {
                backupData = new ThisObject();
                backupAvailable = false;
            }
        }
    
        public Customer() : base()
        {
                this.currentData = new ThisObject();
                this.currentData.guid = Guid.NewGuid().ToString();
                this.currentData.name = string.Empty;
        }
    
        public string GUID
        {
            get { return this.currentData.guid; }
            set { this.currentData.guid = value; }
        }
    
        public string Name
        {
            get { return this.currentData.name; }
            set { this.currentData.name = value; }
        }
    
        public object Clone()
        {
            return (Customer)this.MemberwiseClone();
        }
    }
    

    ...

    private void buttonChange_Click(object sender, EventArgs e)
    {
        ...
        ((Customer)BSCustomer.Current).BeginEdit();
    }
    
    
    private void buttonCancel_Click(object sender, EventArgs e)
    {
        ...
        ((Customer)BSCustomer.Current).CancelEdit();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-23
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多