Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TreeNode.EndEdit与NodeLabelEditEventArgs.CancelEdit_C#_.net_Winforms_Treeview_Treenode - Fatal编程技术网

C# TreeNode.EndEdit与NodeLabelEditEventArgs.CancelEdit

C# TreeNode.EndEdit与NodeLabelEditEventArgs.CancelEdit,c#,.net,winforms,treeview,treenode,C#,.net,Winforms,Treeview,Treenode,TreeNode.EndEdit与设置NodeLabelEditEventArgs.CancelEdit之间有什么区别?从表面上看,调用EndEdit(true)似乎与在or事件处理程序中发出e.CancelEdit=true的操作是一样的。然而,这两种方法并不等同,也不用于相同的目的 最好用一个实际的行为示例来演示: 他们做同样的事情,因为: 如果调用EndEdit(true),树节点将离开编辑模式并放弃更改 如果在标记后编辑期间发出e.CancelEdit=true,则树节点将离开编辑模式

TreeNode.EndEdit
与设置
NodeLabelEditEventArgs.CancelEdit
之间有什么区别?

从表面上看,调用
EndEdit(true)
似乎与在or事件处理程序中发出
e.CancelEdit=true
的操作是一样的。然而,这两种方法并不等同,也不用于相同的目的

最好用一个实际的行为示例来演示:

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

  • 如果调用
    EndEdit(true)
    ,树节点将离开编辑模式并放弃更改
  • 如果在标记后编辑期间发出
    e.CancelEdit=true
    ,则树节点将离开编辑模式并放弃更改
但它们并不等同,因为:

  • 如果不调用
    EndEdit(true)
    ,树节点编辑模式将不会更改(显然)
  • 如果在
    AfterLabelEdit
    期间未发出
    e.CancelEdit=true
    ,则树节点仍将离开编辑模式(并提交更改)
  • 如果在
    beforelabedit
    期间未发出
    e.CancelEdit=true
    ,则树节点仍将进入编辑模式
另一个区别是
EndEdit()
触发
AfterLabelEdit
,但
AfterLabelEdit
不会递归触发自身(幸运的是)

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

应用于在用户仍在编辑标签时强制提交或取消编辑。当然,这意味着
EndEdit(false)
是邪恶和错误的,因为它在用户完成键入之前,未经其同意,就提交了一个潜在的破坏性更改。事实上,我从未见过这样的称呼

如果其他内容现在绝对需要焦点,并且您不想在树节点失去焦点时自动提交未完成的编辑,则调用
EndEdit(true)
放弃当前编辑可能会很有用。不过,以这种方式扔掉用户的工作仍然是不礼貌的

早在MFC时代,有一个合法的使用
EndEdit(true)
等价物:当用户按下
ESC
键时,取消编辑。信不信由你,那个时候MFC不支持这个功能(也许今天还不支持,我没有检查)


但是现在,在我看来,
EndEdit()
没有多少用处了。最好让它平静下来。

不管是邪恶还是邪恶,当我进入顶部菜单时,我不得不调用EndEdit,我的节点没有离开编辑模式。这就是它们之间的主要区别:您可以在任何地方调用EndEdit,而如果AfterLabeleEdit尚未触发,则不能使用CancelEdit。