我正在尝试修复这个丑陋的代码。
RadGrid gv = (RadGrid) (((Control) e.CommandSource).Parent.Parent.Parent.Parent.Parent);
我经常需要找到第一个网格,它是刚刚引发事件的对象的父级的父级。
当布局发生变化并且。父母的数量增加或减少时,上述情况往往会中断。
我不一定有控件ID,所以我不能使用FindControl()。
有没有更好的方法来找到第一个父网格?
答案 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;
}
我没有声称它的效果如何,但它应该让我们了解这个想法。向前导航父链直到没有父级,然后返回该对象以备份递归链。这是蛮力,但无论它有多高,都会找到第一个父母。