2013-03-31 100 views
1

添加控件来控制集合继这两个线程: How can I create an Array of Controls in C#.NET? Cannot Access the Controls inside an UpdatePanel从更新面板

我现在有这样的:

ControlCollection[] currentControlsInUpdatePanel = new ControlCollection[upForm.Controls.Count]; 
foreach (Control ctl in ((UpdatePanel)upForm).ContentTemplateContainer.Controls) 
{ 
    currentControlsInUpdatePanel. 
} 

currentControlsInUpdatePanel不具有添加或插入方法。为什么我发布的第一个链接允许该用户添加到他的收藏中。这是我想要做的,找到我的upForm更新面板中的所有控件。但我没有看到我可以如何将它添加到我的控件集合中。

回答

0

我不认为这段代码有意义。您正在创建一个ControlCollection对象数组,并尝试在其中存储Control对象。此外,由于currentControlsInUpdatePanel对象是一个数组,因此该对象上不会有可用的Add()方法。

如果要使用Add()方法,请尝试将currentControlsInUpdatePanel创建为List对象。

例子:

List<Control> currentControlsInUpdatePanel = new List<Control>(); 
foreach(Control ctl in ((UpdatePanel)upForm).ContentTemplateContainer.Controls) 
{ 
    currentControlsInUpdatePanel.Add(ctl); 
} 

如果你想继续使用的阵列来存储控制的对象,您将需要使用索引值来设置数组中的对象。

例子:

Control[] currentControlsInUpdatePanel = new Control[((UpdatePanel)upForm).ContentTemplateContainer.Controls.Count]; 
for(int i = 0; i < upForm.Controls.Count; i++) 
{ 
    currentControlsInUpdatePanel[i] = ((UpdatePanel)upForm).ContentTemplateContainer.Controls[i]; 
} 
0

UpdatePanel的子控件集合是一个特殊的集合,它只包含一个子控件:它的模板容器。那么控件包含了UpdatePanel的所有子控件(例如GridViewButton)。

正如问题中提到的其他问题所指出的那样,递归地行走子控制树是最好的方法。然后,当您找到需要添加控件的位置时,请在该位置拨打Controls.Add()

我的建议将是一种不同的方法:在UpdatePanel中放置一个<asp:PlaceHolder>控件,并给它一个名称并为其添加控件。访问UpdatePanel本身的控件集合应该没有什么特别的优势,那么您就不必深入了解控件的实现细节(虽然它们不太可能发生变化,但会使代码更加难以阅读) 。

0

尝试使用

ControlCollection collection = ((UpdatePanel)upForm).ContentTemplateContainer.Controls; 

这使您控制集合中的所有控件。从那里,你可以使用CopyTo用于将其复制到阵列您需要:

Control[] controls = new Control[collection.Length]; 
collection.CopyTo(controls , 0);