TreeNode.EndEdit
和设置NodeLabelEditEventArgs.CancelEdit
之间的区别是什么?
答案 0 :(得分:6)
好吧,从表面上看,调用EndEdit(true)
确实与在AfterLabelEdit或BeforeLabelEdit事件处理程序中发布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
还没有多少用处。最好让它安息吧。