TreeNode.EndEdit
和 设置 和有什么不一样NodeLabelEditEventArgs.CancelEdit
?
1 回答
好吧,从表面上看,调用EndEdit(true)
确实看起来与e.CancelEdit = true
在AfterLabelEdit或BeforeLabelEdit事件处理程序中发出相同的事情。但是,这两种方法并不等效,并且没有用于相同的目的。
最好用一个实际的行为示例来演示:
他们做同样的事情,因为:
- 如果您调用
EndEdit(true)
,树节点将离开编辑模式并丢弃更改, - 如果
e.CancelEdit = true
在 期间发出AfterLabelEdit
,树节点将离开编辑模式并丢弃更改。
但它们并不等价,因为:
- 如果不调用
EndEdit(true)
,树节点编辑模式不会改变(显然), - 如果您在 期间不发出,树节点仍将离开编辑模式(并提交更改),
e.CancelEdit = true
AfterLabelEdit
- 如果在 期间不发出,树节点仍将进入编辑模式。
e.CancelEdit = true
BeforeLabelEdit
另一个区别是EndEdit()
triggers AfterLabelEdit
,但AfterLabelEdit
不会递归地触发自身(幸运的是)。
现在,通常NodeLabelEditEventArgs.CancelEdit用于验证,即丢弃对树节点标签的无效修改(期间AfterLabelEdit
)或完全阻止用户编辑某些节点的标签(期间BeforeLabelEdit
)。在这两种情况下,用户要么已经完成或尚未开始编辑标签。
EndEdit()应该用于在用户仍在编辑 label 时强制提交或取消编辑。当然,这意味着邪恶和错误,因为它在用户完成输入之前并且未经他的同意就提交了EndEdit(false)
潜在的破坏性更改。所以,实际上,我从未见过这样称呼它。
EndEdit(true)
如果其他东西现在绝对需要焦点并且您不想在树节点失去焦点时自动提交不完整的编辑,则调用丢弃当前编辑可能很有用。但是,以这种方式丢弃用户的工作仍然是不礼貌的。
EndEdit(true)
早在 MFC 时代,有一个等效的合法用途:当用户按下ESC
键时取消编辑。信不信由你,当时 MFC 中不支持开箱即用的功能(也许今天仍然不支持,我没有检查)。
EndEdit()
但是现在,在我看来,没有太多用处了。不如让它安息吧。