2009-04-20 6 views
3

J'essaye de réparer ce code moche.Comment éviter .Parent.Parent.Parent. etc. lors du référencement des hiérarchies de contrôle?

RadGrid gv = (RadGrid) (((Control) e.CommandSource).Parent.Parent.Parent.Parent.Parent); 

J'ai souvent besoin de trouver la première grille qui est le parent du parent de ... etc d'un objet qui vient de soulever un événement.

Ce qui précède a tendance à se casser lorsque la disposition change et le nombre de .Parents augmente ou diminue.

Je n'ai pas nécessairement d'ID de contrôle, donc je ne peux pas utiliser FindControl().

Existe-t-il une meilleure façon de trouver la grille du premier parent?

+0

Recursion est votre ami dans ce type de problème. –

+1

La récursivité est parfois une solution, mais jamais votre ami ;-) –

+0

Alors que la récursivité est une solution naturelle pour certains problèmes, elle a ses limites. Les plus importants sont les débordements de pile ;-) et la surcharge des appels de fonction. –

Répondre

12
Control parent = Parent; 
while (!(parent is RadGrid)) 
{ 
    parent = parent.Parent; 
} 
+0

J'aime celui-ci. Je vais probablement ajouter un compteur pour lancer une assertion/erreur si elle entre dans une boucle infinie. – MatthewMartin

1

Je ne suis pas au courant de l'API que vous utilisez, mais pouvez-vous faire quelque chose comme:

Control root = ((Control)e.CommandSource); 
while(root.Parent != null) 
{ 
    // must start with the parent 
    root = root.Parent; 

    if (root is RadGrid) 
    { 
     // stop at the first grid parent 
     break; 
    } 
} 
// might throw exception if there was no parent that was a RadGrid 
RadGrid gv = (RadGrid)root; 
1

Si vous avez le contrôle du code du parent, vous pouvez utiliser récursivité simple ça, je pense. Quelque chose comme:

public Control GetAncestor(Control c) 
{ 
    Control parent; 
    if (parent = c.Parent) != null) 
     return GetAncestor(parent); 
    else 
     return c; 
} 

Je ne prétends pas à quel point cela fonctionnera, mais il devrait faire passer l'idée. Naviguez le long de la chaîne parent jusqu'à ce qu'il n'y ait pas de parent, puis retournez cet objet dans la chaîne de récursivité. C'est une force brute, mais elle trouvera le premier parent, peu importe son niveau.

3

Si vous avez vraiment trouver la grille, alors vous pourriez quelque chose comme ceci:

Control ct = (Control)e.CommandSource; 
while (!(ct is RadGrid)) ct = ct.Parent; 
RadGrid gv = (RadGrid)ct; 

Mais vous pouvez peut-être expliquer pourquoi vous avez besoin d'une référence à la grille? Peut-être qu'il existe une autre/meilleure solution pour votre problème.

Questions connexes