Как определить тип динамически загружаемого usercontrol? - PullRequest
1 голос
/ 09 декабря 2008

У меня есть приложение, которое будет загружать пользовательские элементы управления динамически в зависимости от пользователя. В приведенном ниже примере вы увидите, что я использую каждый элемент управления с помощью операторов 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);
}

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 09 декабря 2008

Как насчет определения интерфейса с событием 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);
  }
}
1 голос
/ 09 декабря 2008

Как насчет:

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

Я не тестировал этот код, но он должен быть примерно таким.

1 голос
/ 09 декабря 2008

Я не вижу ничего специфичного для класса управления в вашем коде. Вы выполняете точно такие же операции, и похоже, что все пользовательские элементы управления наследуются от Control.

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

Если вы не можете контролировать источник элементов управления, то предложение Jeroen должно сработать.

0 голосов
/ 09 декабря 2008

Вы можете попробовать TypeOf (в c #) или сработает uc.GetType ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...