如何避免.Parent.Parent.Parent。等引用控制层次结构时?

时间:2009-04-20 21:40:27

标签: c# asp.net

我正在尝试修复这个丑陋的代码。

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

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

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

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

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

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

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

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

但也许您可以解释为什么需要引用网格?也许还有另一个/更好的解决方案来解决你的问题。

答案 2 :(得分: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;

答案 3 :(得分:1)

如果您可以控制Parent的代码,您可以使用简单的递归来完成它,我想。类似的东西:

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

我没有声称它的效果如何,但它应该让我们了解这个想法。向前导航父链直到没有父级,然后返回该对象以备份递归链。这是蛮力,但无论它有多高,都会找到第一个父母。