在另一个控件之前插入控件

12

在 asp.net 中,我如何动态地在另一个控件之前插入一个控件?假设 control1 是网页上的某个控件,我想要动态创建并在 control1 之前插入一个表格。

例如:

table1 = new Table();
table1.ID = "Table1";

但下一步怎么做?要将控件作为子级添加,我可以这样做:control1.Controls.Add(table1);但是,我该如何在控件control1之前插入table1?

2个回答

20
如果你想让新控件 (controlB) 立即出现在 controlA 之前,你可以确定 Page.Controls 集合中 controlA 的索引,并在该位置插入 controlB。我认为这将使 controlA 的索引向前移动一个位置,从而使它们成为所需的相邻兄弟节点。
if(Page.Controls.IndexOf(controlA) >= 0)
    Page.Controls.AddAt(Page.Controls.IndexOf(controlA), controlB);

编辑:

还有一点需要注意-上述假设控件A和B位于根页面级别上。 您还可以使用Parent属性,以确保兄弟插入无论controlA在页面层次结构中的位置如何都能正常工作:

Control parent = controlA.Parent;

if(parent != null && parent.Controls.IndexOf(controlA) >= 0)
{
    parent.Controls.AddAt(parent.Controls.IndexOf(controlA), controlB);
}

实际上,我更喜欢这种方法,因为它更灵活,不依赖于Page


2
你会在哪个事件中调用它?因为我总是得到“控件集合不能在DataBind、Init、Load、PreRender或Unload阶段修改”的错误。 - Andrej K
我第一次看AddAt时,情况有些混乱。我很确定它与主页面有关,但我不确定。你能解释一下“根页面级别”的意思吗?我有些困惑,不知道该查什么。 - wazz
刚刚检查了一下父级,我认为是主页面搞错了。我正在处理的控件的父级是“ContentPlaceHolder”。 - wazz

0
你试过 control1.Controls.AddAt(0, table1) 吗?有点奇怪,他们没有像大多数其他集合类型一样调用 Insert 方法。

control1.Controls不应该是control1的子控件吗?我需要在与control1同级别的位置插入。 - AJ.
糟糕!抱歉,我误解了。看起来你已经找到了一个解决方案。 - Brad Nabholz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接