Tree View Indicatore condizione bambini sul genitore non espanso più in alto

-1

Sto usando una vista ad albero in c # e sto creando icone personalizzate per i nodi.

Diciamo che questa è la mia gerarchia con un nodo che soddisfa una certa condizione:

Root1
|_Ax
 |_Bx1
 |_Bx2
  |_Cx1
  |_Cx2(condition true)
 |_Bx3
 |_Bx4
|_Ay
 |_By1
 |_By2
  |_Cy1

quando l'albero è collassato non so se un bambino interiore soddisfa quella particolare condizione quindi voglio visualizzare un'icona sul genitore non espanso più in alto.

Ad esempio diciamo che l'albero è completamente collassato Mi piacerebbe questo comportamento: 1) la prima radice sarà così:

Root1(!)

2) Espongo Root1 e vedo che c'è qualcosa che i bambini di Axe:

Root1
|_Ax(!)
|_Ay

3) Espongo Ax:

Root1
|_Ax
 |_Bx1
 |_Bx2(!)
 |_Bx3
 |_Bx4
|_Ay

4) Ultimo espongo Bx2 per trovare il nodo di destinazione Cx2:

Root1
|_Ax
 |_Bx1
 |_Bx2
  |_Cx1
  |_Cx2(condition true)
 |_Bx3
 |_Bx4
|_Ay

Il simbolo (!) viene visualizzato solo nell'elemento padre non espanso più in alto e scompare dopo l'espansione del nodo che indica un percorso per individuare il nodo di destinazione Cx2.

Ma vorrei qualche idea su come aggiungere l'indicatore del nodo (!) in modo efficiente.

Devo farlo in 2 passaggi  - creazione di alberi  - nodo espanso

Nel primo caso non appena creo il nodo Cx2 e noto che soddisfa quella particolare condizione, ho bisogno di mettere l'indicatore sul nodo genitore più in alto non espanso.

Nel secondo caso ho bisogno di cambiare dinamicamente la posizione dell'indicatore quando il nodo è espanso.

Qual è il modo più efficace per farlo?

    
posta powernemo 13.05.2014 - 16:30
fonte

2 risposte

0

La ricorsione è davvero uno dei modi più eleganti di fare aggiornamenti TreeView. Quando stavo iniziando per la prima volta nella programmazione e non avevo un solido controllo sulla ricorsione, ho cercato ogni scusa che potevo trovare per NON usare TreeViews. Ora che ho qualche anno di programmazione sotto la cintura, tendo ad apprezzare la ricorsione. Dai una possibilità:

    private void Form1_Load(object sender, EventArgs e)
    {
        //Initializing the TreeView
        init_view();

        //Check to see if the main nodes in your TreeView should be marked
        foreach (TreeNode t in myTree.Nodes)
        {
            if (containsCondition(t))
            {
                toggleMark(t);
            }
        }
    }

    //Recursive. Checks to see if the supplied TreeNode contains ANY nodes 
    //that meet your condition. This will be the main workhorse 
    //for formatting your TreeView.
    private bool containsCondition(TreeNode target)
    {
        bool rtn = false;

        foreach (TreeNode childNode in target.Nodes)
        {
            //If childNode meeds conditions, break the foreach. If not, 
            //search each child of the childNode recursively.
            if (conditionMet(childNode))
            {
                rtn = true;
                break;
            }
            else
            {
                rtn = containsCondition(childNode);

                //If any condition was found in the children of the childNode, break.
                if (rtn == true)
                {
                    break;
                }
            }
        }

        return rtn;
    }

    //Simple function to toggle the (!) at the end of a node. 
    private void toggleMark(TreeNode t)
    {
        if (t.Text.EndsWith("(!)"))
        {
            t.Text = t.Text.Substring(0, t.Text.Length - 3);
        }
        else
        {
            t.Text = t.Text + "(!)";
        }
    }

    // Checks to see if a TreeNode meets the conditions I specified 
    //(in this case, that the tag = "true"). Change to meet your condition.
    private bool conditionMet(TreeNode t)
    {
        bool rtn = false;

        //Make sure tag isn't null before checking.
        if (t.Tag != null)
        {
            if (t.Tag.ToString() == "true")
            {
                rtn = true;
            }
        }

        return rtn;
    }

    //Your TreeView's BeforeExpand event. This removes the flag 
    //from the node being expanded while marking any children nodes 
    //that meet your condition.
    private void myTree_BeforeExpand(object sender, TreeViewCancelEventArgs e)
    {
        //If the expanded node was marked, remove the mark.
        if (e.Node.Text.EndsWith("(!)"))
        {
            toggleMark(e.Node);
        }

        //Check all the child nodes of the expanded node to see if they should be marked.
        foreach (TreeNode childNode in e.Node.Nodes)
        {
            if (containsCondition(childNode))
            {
                toggleMark(childNode);
            }
        }
    }

Ora, hai richiesto (e ho codificato nel mio esempio) che ogni nodo che contiene un nodo figlio che soddisfa la tua condizione abbia il testo del nodo aggiunto con (!). Se si desidera essere veramente fantasiosi, è possibile utilizzare diverse immagini o icone per i nodi che soddisfano la condizione. Tuttavia, la creazione di raccolte di immagini e il loro utilizzo è una possibilità completamente diversa di worm.

link

link

link

EDIT: In realtà, rileggendo il tuo post, sembra che tu stia già sviluppando icone e intendi utilizzare le icone invece di accodare (!). In tal caso, potresti semplicemente cambiare la funzione toggleMark per cambiare le immagini invece di modificare il testo del nodo.

    
risposta data 18.05.2014 - 00:00
fonte
0

Non penso che la ricorsione sia il modo efficace per risolvere questo problema perché espandendo il nodo marcato dovresti applicare tale ricorsione su ogni singolo dei suoi figli.

Un nodo contrassegnato deve contenere informazioni (ad esempio in forma di elenco, matrice, ...) quali dei suoi discendenti corrispondono alla condizione. Quindi, se il nodo contrassegnato viene espanso, si inizia dal nodo corrispondente alla condizione e si sale fino a raggiungere il primo nodo visibile e contrassegnarlo. Dopo averlo fatto per ogni discendente, rimuovi il marcatore dal nodo genitore ora espanso.

    
risposta data 14.11.2014 - 09:51
fonte

Leggi altre domande sui tag