2008-12-09 8 views
1

J'ai une application qui chargera usercontrols dynamiquement en fonction de l'utilisateur. Vous verrez dans l'exemple ci-dessous que je lance le contrôle de chaque utilisateur via des instructions switch/case. Y a-t-il une meilleure manière de faire cela? Réflexion? (Je dois être en mesure d'ajouter un gestionnaire d'événements Lier dans chaque contrôle.)Comment déterminer le type d'usercontrol chargé dynamiquement?

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

Merci d'avance!

Répondre

1

Je ne vois rien de spécifique à la classe de contrôle dans votre code. Vous effectuez exactement les mêmes opérations et il semble que tous les contrôles utilisateur héritent de Control. Si la seule chose spécifique est la liaison d'événement (par exemple, la classe Control n'a pas d'événement Bind), alors pensez mieux à refactoriser votre code, ainsi vous faites hériter tous vos contrôles utilisateur comme ceci: Control -> MyBaseControl (put l'événement ici) -> YouControl.

Si vous ne pouvez pas contrôler la source des contrôles, alors la suggestion de Jeroen devrait fonctionner.

0

Vous pourriez essayer TypeOf (en C#) ou uc.GetType() fonctionnerait.

1

Que diriez-vous:

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

Je ne l'ai pas testé ce code, mais il devrait être quelque chose comme ça.

1

Que diriez-vous de définir une interface avec un événement Bind et que les contrôles l'implémenteront?

public interface IBindable 
{ 
    event EventHandler Bind; 
} 

Puis:

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