我有一个应用程序将根据用户动态加载usercontrols。您将在下面的示例中看到我通过switch / case语句转换每个用户控件。有一个更好的方法吗?反射? (我必须能够在每个控件中添加一个事件处理程序Bind。)
override protected void OnInit(EventArgs e)
{
cc2007.IndividualPageSequenceCollection pages = new IndividualPageSequenceCollection().Load();
pages.Sort("displayIndex", true);
foreach (IndividualPageSequence page in pages)
{
Control uc = Page.LoadControl(page.PageName);
View view = new View();
int viewNumber = Convert.ToInt32(page.DisplayIndex) -1;
switch(page.PageName)
{
case "indStart.ascx":
IndStart = (indStart) uc;
IndStart.Bind += new EventHandler(test_handler);
view.Controls.Add(IndStart);
MultiView1.Views.AddAt(viewNumber, view);
break;
case "indDemographics.ascx":
IndDemographics = (indDemographics)uc;
IndDemographics.Bind += new EventHandler(test_handler);
view.Controls.Add(IndDemographics);
MultiView1.Views.AddAt(viewNumber, view);
break;
case "indAssetSurvey.ascx":
IndAssetSurvey = (indAssetSurvey)uc;
IndAssetSurvey.Bind += new EventHandler(test_handler);
view.Controls.Add(IndAssetSurvey);
MultiView1.Views.AddAt(viewNumber, view);
break;
}
}
base.OnInit(e);
}
提前致谢!
答案 0 :(得分:1)
怎么样:
Type t = uc.GetType();
EventInfo evtInfo = t.GetEvent("Bind");
evtInfo.AddEventHandler(this, new EventHandler(test_handler));
我没有测试过这段代码,但应该是这样的。
答案 1 :(得分:1)
我的代码中没有看到任何特定于控件类的内容。您执行完全相同的操作,看起来所有用户控件都从Control继承。
如果唯一特定的事情是事件绑定(即Control类没有Bind事件),那么最好考虑重构代码,这样就可以使所有用户控件继承如下:Control - > MyBaseControl(把事件放在这里) - > YouControl。
如果您无法控制控件的来源,那么Jeroen建议应该有效。
答案 2 :(得分:1)
如何使用Bind事件定义接口并让控件实现它?
public interface IBindable
{
event EventHandler Bind;
}
然后:
foreach (IndividualPageSequence page in pages)
{
IBindable uc = Page.LoadControl(page.PageName) as IBindable;
if( uc != null )
{
uc.Bind += new EventHandler(test_handler);
View view = new View();
view.Controls.Add(page);
int viewNumber = Convert.ToInt32(page.DisplayIndex) -1;
MultiView1.Views.AddAt(viewNumber, view);
}
}
答案 3 :(得分:0)
您可以尝试TypeOf(在c#中)或者uc.GetType()可以工作。