2008-12-09 3 views
1

У меня есть приложение, которое будет загружать пользовательские контроллеры динамически в зависимости от пользователя. В приведенном ниже примере вы увидите, что я выполняю управление каждым пользователем с помощью операторов switch/case. Есть лучший способ сделать это? Отражение? (Я должен быть в состоянии добавить обработчик события. Привязать к каждому элементу управления.)Как определить тип динамически загруженного пользовательского контроля?

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.

Если конкретная вещь связана с событием (т.е. класс управления не имеет события Bind), то лучше подумайте о рефакторинге вашего кода, чтобы вы наделили все свои пользовательские элементы следующим образом: 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

Как определить интерфейс с событием 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); 
    } 
} 
Смежные вопросы