2008-12-09 71 views
1

我有一個應用程序將根據用戶動態加載usercontrols。您將在下面的示例中看到,我通過switch/case語句來投射每個用戶控件。有一個更好的方法嗎?反射? (我必須能夠在每個控件中添加事件處理程序綁定。)如何確定動態加載的usercontrol的類型?

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); 
} 

在此先感謝!

回答

1

我在代碼中看不到任何控件類特定的東西。您執行完全相同的操作,並且看起來像從Control繼承的所有用戶控件。如果唯一具體的事情是事件綁定(即Control類沒有綁定事件),那麼最好考慮重構你的代碼,所以你讓所有的用戶控件繼承像這樣:Control - > MyBaseControl(put這裏的事件) - > YouControl。

如果您無法控制控件的來源,那麼Jeroen的建議應該可以工作。

0

你可以嘗試TypeOf(在c#中)或uc.GetType()工作。

1

如何:

 
Type t = uc.GetType(); 
EventInfo evtInfo = t.GetEvent("Bind"); 
evtInfo.AddEventHandler(this, new EventHandler(test_handler)); 

我還沒有測試此代碼,但它應該是類似的東西。

1

如何使用綁定事件定義接口並使控件實現它?

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); 
    } 
}