TreeNode.EndEdit vs NodeLabelEditEventArgs.CancelEdit

时间:2010-05-11 00:05:52

标签: c# .net winforms treeview treenode

TreeNode.EndEdit和设置NodeLabelEditEventArgs.CancelEdit之间的区别是什么?

1 个答案:

答案 0 :(得分:6)

好吧,从表面上看,调用EndEdit(true)确实与在AfterLabelEditBeforeLabelEdit事件处理程序中发布e.CancelEdit = true的行为相同。但是,这两种方法并不相同,并且不用于相同的目的。

最好通过实际行为示例进行演示:

他们做同样的事情,因为:

  • 如果您致电EndEdit(true),树节点将退出编辑模式并放弃更改,
  • 如果您在e.CancelEdit = true期间发出AfterLabelEdit,则树节点将退出编辑模式并放弃更改。

但他们并不等同,因为:

  • 如果调用EndEdit(true),树节点编辑模式将更改(显然),
  • 如果您在e.CancelEdit = true期间发出AfterLabelEdit,则树节点将退出编辑模式(并提交更改),< / LI>
  • 如果您在e.CancelEdit = true期间发出BeforeLabelEdit,则树节点将仍然进入编辑模式。

另一个区别是EndEdit()触发AfterLabelEdit,但AfterLabelEdit不会递归触发(幸运的是)。

现在,通常NodeLabelEditEventArgs.CancelEdit用于验证,即放弃对树节点标签的无效修改(在AfterLabelEdit期间)或完全阻止用户编辑某些节点的标签(在{期间) {1}})。在这两种情况下,用户已经完成或尚未开始编辑标签。

当用户仍在编辑标签时,

EndEdit()应该用于强制提交或取消编辑。当然,这意味着BeforeLabelEdit evil 错误,因为它在用户完成输入之前提交了一个潜在的重大变更 没有他的同意。所以,实际上,我从未见过这种方式。

调用EndEdit(false)放弃当前编辑可能非常有用,如果其他绝对需要焦点现在并且您不想自动提交不完整的在树节点失去焦点时编辑。但是,以这种方式抛弃用户的工作仍然很粗鲁。

回到MFC时代,合法使用EndEdit(true)等价物:当用户按下EndEdit(true)键时取消编辑。信不信由你,MFC当时不支持该功能(可能仍然不是今天,我没有检查)。

但是现在,在我看来,ESC还没有多少用处。最好让它安息吧。