好吧,从表面上看,调用EndEdit(true)确实看起来像e.CancelEdit = true在AfterLabelEdit或BeforeLabelEdit事件处理程序中发出一样.但是,这两种方法并不相同,并且不用于相同的目的.
最好用实际行为示例演示:
他们做同样的事情,因为:
EndEdit(true),树节点将离开编辑模式并丢弃更改,e.CancelEdit = true期间AfterLabelEdit,树节点将退出编辑模式并放弃更改.但它们并不等同,因为:
EndEdit(true),树节点编辑模式将不会改变(显然),e.CancelEdit = true在期间发出AfterLabelEdit,树节点仍将离开编辑模式(并提交更改),e.CancelEdit = true在此期间发出BeforeLabelEdit,则树节点仍将进入编辑模式.另一个区别是EndEdit()触发器AfterLabelEdit,但AfterLabelEdit不会递归触发(幸运的是).
现在,通常NodeLabelEditEventArgs.CancelEdit用于验证,即丢弃对树节点标签的无效修改(期间AfterLabelEdit)或完全阻止用户编辑某些节点的标签(期间BeforeLabelEdit).在这两种情况下,用户已经完成或尚未开始编辑标签.
EndEdit中()应该被用于强制提交或取消编辑在用户仍在编辑标签.当然,这意味着EndEdit(false)是邪恶和错误的,因为它在用户完成输入之前未经他的同意就提交了一个潜在的重大变化.所以,实际上,我从未见过这种方式.
EndEdit(true)如果其他东西现在绝对需要焦点并且您不希望在树节点失去焦点时自动提交不完整的编辑,则调用放弃当前编辑可能很有用.但是,以这种方式抛弃用户的工作仍然很粗鲁.
回到MFC时代,有一个合法的用途EndEdit(true):当用户按下ESC键时取消编辑.信不信由你,MFC当时不支持该功能(可能仍然不是今天,我没有检查).
但是现在,EndEdit()在我看来,剩下的用处并不多.最好让它安息吧.
| 归档时间: |
|
| 查看次数: |
2081 次 |
| 最近记录: |