2009-04-20 63 views
3

我正试图修复这个难看的代码。如何避免.Parent.Parent.Parent。等参考控制层次?

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

我经常需要找到第一个网格,它是刚刚引发一个事件的对象的父节点的父节点的父节点。

当布局发生变化并且.Parents数量增加或减少时,上述情况往往会中断。

我不一定有一个控件ID,所以我不能使用FindControl()。

有没有更好的方法来找到第一个父网格?

+0

递归是你在这类问题中的朋友。 – 2009-04-20 23:11:46

+1

递归有时是一种解决方案,但从来没有你的朋友;-) – 2009-04-20 23:25:58

回答

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

我不熟悉您所使用的API,但你可以这样做:

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

如果你有父母的代码的控制,你可以使用简单而又重复的做它,我想。例如:

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

我没有声称它能够工作多好,但它应该可以实现。直到父链没有父节点为止,继续向上浏览父链,然后将该对象返回到递归链。这是蛮力,但它会找到第一个父母,不管它有多高。

3

如果你真的要找到网格,那么你可能是这样的:

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

但是,也许你能解释一下为什么你需要给电网的参考?也许你的问题有另一个/更好的解决方案。