2017-04-25 4 views
0

j'initialiser le composant dans le code de concepteur:Marque TreeNode ne peut être sélectionné, mais toujours fonctionnel

private void InitializeComponent(){ 
    this.treeViewCategory.Name = "treeViewCategory"; 
    this.treeViewCategory.Size = new System.Drawing.Size(287, 303); 
    this.treeViewCategory.TabIndex = 14; 
    this.treeViewCategory.DoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeViewCategory_TreeNodeMouseClickEventHandler); 
} 

En dehors du designer, je le modifie:

this.treeViewCategory.Update(); 
TreeNode node = this.treeViewCategory.Nodes.Add("Node 1"); 
node.Name = "Node 1"; 
node.Nodes.Add("Node 1-Child"); 
node = this.treeViewCategory.Nodes.Add("Node 2"); 
node.Name = "Node 2"; 
node.Nodes.Add("Node 2-Child 1"); 
node.Nodes.Add("Node 2-Child 2"); 
this.treeViewCategory.ExpandAll(); 
this.treeViewCategory.EndUpdate(); 

Je veux nœud 1 et nœud 2 être fonctionnel mais non sélectionnable. Donc cliquer sur le nœud 1 ou le nœud 2 augmenterait/contracterait la branche, mais le nœud lui-même ne serait pas mis en surbrillance.

private void treeViewCategory_TreeNodeMouseClickEventHandler(object sender, TreeNodeMouseClickEventArgs eventArgs) 
{ 
    TreeView treeView = (TreeView)sender; 
    TreeNode treeNode = eventArgs.Node; // parent or child 
    String nodeText = treeNode.Text; 

    // if parent node 
    if (nodeText.Contains("Node 1") || nodeText.Contains("Node 2")) { 
     // don't select the node 

    } 
    else { // child 

    } 
} 

En treeViewCategory_TreeNodeMouseClickEventHandler, je peux distinguer entre le parent et l'enfant, mais je ne vois rien qui fait ce que je veux faire.

Parent node highlighted

+0

Ne pas modifier le code de concepteur! – TaW

+0

Ne pouvez-vous pas simplement sélectionner le noeud enfant dans l'événement? Et que comptez-vous faire pour choisir le noeud avec le clavier? – stuartd

+0

@TaW: Où voyez-vous le code du concepteur en train d'être modifié dans mon exemple? –

Répondre

3

Ajouter un gestionnaire pour l'événement BeforeSelect du TreeView, et annuler la sélection là-bas.

// Add unselectable nodes to this collection when you create them 
private List<TreeNode> _unselectableNodes = new List<TreeNode>(); 

private void treeViewCategory_BeforeSelect(object sender, TreeViewCancelEventArgs e) 
{ 
    if (_unselectableNodes.Contains(e.Node)) 
    { 
     e.Cancel = true; 
    } 
} 

Malheureusement, comme il est indiqué dans les commentaires, cela ne empêche sélection tant que revenir lorsque l'utilisateur relâche le bouton de la souris. Ma préférence serait que l'événement BeforeSelect se produise entièrement avant que la sélection ait lieu. Mais il y a probablement une raison à cela.

Configuration du gestionnaire, si vous ne le faites pas via le constructeur de formulaire. Cela devrait aller dans le constructeur de votre formulaire. Pas besoin pour le constructeur délégué si treeViewCategory_BeforeSelect a le bon type de retour et de paramètre.

this.treeViewCategory.BeforeSelect += treeViewCategory_BeforeSelect; 

Création de noeud:

TreeNode node = this.treeViewCategory.Nodes.Add("Node 1"); 
node.Name = "Node 1"; 
_unselectableNodes.Add(node); 

node.Nodes.Add("Node 1-Child"); 

node = this.treeViewCategory.Nodes.Add("Node 2"); 
node.Name = "Node 2"; 
_unselectableNodes.Add(node); 
+1

Ceci est la ligne pour ajouter le handle au contrôle: 'this.treeViewCategory.BeforeSelect + = new System.Windows.Forms.TreeViewCancelEventHandler (this.treeViewCategory_BeforeSelect);' Cela fonctionne et a l'effet malheureux que le nœud est en surbrillance (et puis revenir au noeud précédemment sélectionné). Quel terrible design. –

+1

@AlLelopath Je suis d'accord. Le bit de réversion de sélection est moche. "Avant" devrait signifier avant. –