Asp.Net如何利用反射获得页面所有控件.(我的框架里面是用的FineUI控件,里面的Button是继承微软的)
我也写了一个测试用例:(主要的是找Button控件.)
代码如下:
Assembly asm = Assembly.Load("WebUI");//.net中的反射
Type[] types = asm.GetTypes();
Page f = null;
foreach (Type t in types)
{
int i = 0;
if (t.BaseType.Name == "Page")
{
try
{
f = (Page)Activator.CreateInstance(t, true);
if (f != null)
{
i++;
//ListViewItem listItem = new ListViewItem(f.);
//listItem.SubItems.Add(f.Text);
//listItem.Tag = f;
//listForm.Add(listItem);
//// listView1.Items.
//listView1.Items.Add(listItem);
}
}
catch { }
}
但是会报错,Page未将对象引用设置到对象的实例。
请高手帮忙看看..谢谢
要想获取页面所有的控件,没有必要用反射。
private void GetControlList<T>(ControlCollection controlCollection, List<T> resultCollection) where T : Control { foreach (Control control in controlCollection) { //if (control.GetType() == typeof(T)) if (control is T) // This is cleaner resultCollection.Add((T)control); if (control.HasControls()) GetControlList(control.Controls, resultCollection); } }
List<Button> allControls = new List<Button>(); GetControlList<Button>(Page.Controls, allControls ) foreach (var childControl in allControls ) { // call for all controls of the page }
这样就可以了。
首先,谢谢你的的方案.但是我的项目里面需要实现动态获取所有的控制.嗯.我先说下项目的需求,首先,这个 BaseLoad方法(PageBase类继承System.Web.UI.Page) 写在PageBese类,在这个PageBase类中我在我重写 protected override void OnLoad(EventArgs e),每个页面都继承写好的这个类. 我想的是每当页面加载时,就动态获得这个加载页面的所有控件(如:Button).这样我就能实现,当点击不同页面时,就可以获得不同页面的控件了. 我也查询一些资料,他们说反射好实现.我对反射这个东西很少用,用得不熟悉.(我项目里面引用了FineUI控件,不知道这个影响我之前写的方法.唉..很头痛啊.. 这个控件也是继承 WebConstrols 类(System.Web.UI.WebControls).)