C# Winform:TreeView节点折叠而不触发节点单击事件

C# Winform:TreeView节点折叠而不触发节点单击事件,c#,winforms,click,treeview,collapse,C#,Winforms,Click,Treeview,Collapse,我需要防止节点崩溃时发生单击事件。我仍然希望节点折叠并隐藏其下的所有子节点,但我不希望触发单击事件或选择节点(如果可能)。如果您只需要影响自己的代码,可以使用如下标志: bool suppressClick = false; private void treeView1_Click(object sender, EventArgs e) { if (suppressClick) return; // else your regular code.. } private voi

我需要防止节点崩溃时发生单击事件。我仍然希望节点折叠并隐藏其下的所有子节点,但我不希望触发单击事件或选择节点(如果可能)。

如果您只需要影响自己的代码,可以使用如下标志:

bool suppressClick = false;

private void treeView1_Click(object sender, EventArgs e)
{
    if (suppressClick) return;
    // else your regular code..
}

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Node.IsExpanded)
         { suppressClick = false; }
    else { suppressClick = true; }
}

要获得更多控制权,您可能需要访问windows消息队列。

我尝试使用前一种解决方案,但它只起到了一种作用。我实现了一个字典,在其中我保持节点展开/折叠状态,因此当我发现状态相同时,它是实际的节点单击,而不是折叠/扩展行为

public class Yourclass {  

       var nodeStates = new Dictionary<int, bool>();

         public void addNode(Yourentity entity) 
         {
              TreeNode node= new TreeNode(entity.Name);
              node.Tag = entity;
              tree.Nodes.Add(entity);
              nodeStates.Add(entity.Id, true /* expanded in this case but doesn't matter */);
         }

       private void TreeControl_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) {
         var entity = (Yourentity )e.Node.Tag;
         bool state = nodeStates[entity.Id];

         // If was expanded or collapsed values will be different
         if (e.Node.Nodes.Count > 0 && (e.Node.IsExpanded != state))
         {
            // We update the state
             nodeStates[entity.Id] = e.Node.IsExpanded;
             return;
         }

         /* Put here your actual node click code */
     }
}
公共类Yourclass{
var nodeStates=新字典();
public void addNode(您的实体)
{
TreeNode节点=新的TreeNode(entity.Name);
node.Tag=实体;
tree.Nodes.Add(实体);
nodeStates.Add(entity.Id,true/*在本例中已展开,但无所谓*/);
}
私有的void树控件\u NodeMouseClick(对象发送方,树DemouseClickEventArgs e){
var entity=(yourtentity)e.Node.Tag;
bool state=nodeStates[entity.Id];
//如果展开或折叠,则值将不同
如果(e.Node.Nodes.Count>0&(e.Node.IsExpanded!=状态))
{
//我们更新状态
nodeStates[entity.Id]=e.Node.IsExpanded;
返回;
}
/*将实际的节点单击代码放在这里*/
}
}