как вызвать событие из динамически создаваемого usercontrol - PullRequest
1 голос
/ 04 декабря 2008

Как вызвать событие из пользовательского элемента управления, который был создан динамически?

Вот код, который я пробую, где Bind является публичным EventHandler

protected indDemographics IndDemographics;
protected UserControl uc;
override protected void OnInit(EventArgs e)
{
    uc = (UserControl)LoadControl("indDemographics.ascx");
    IndDemographics.Bind += new EventHandler(test_handler);
    base.OnInit(e);
}

Я получаю нулевой объект для IndDemographics. Может кто-нибудь указать мне полный пример кода? Заранее спасибо ...

Ответы [ 3 ]

3 голосов
/ 04 декабря 2008

Прежде всего, вам нужно убедиться, что у вас есть событие, определенное в коде вашего usercontrol.

например:

public class MyUserControl
  Inherits UserControl

  Public Event Bind(sender as object, e as EventArgs)

  public sub SomeFunction()
     RaiseEvent Bind(me, new EventArgS())
  End Sub
End Class

После этого вы можете привязаться к событию. Теперь, для вашей другой проблемы, вы загружаете этот элемент управления динамически или он объявлен на вашей стороне ASPX? Если он на стороне ASPX, то вам не нужен LoadControl, поскольку объявление объекта как Runat = Server на стороне ASPX создает экземпляр указанного класса.

Если нет, то вам нужно убедиться, что вы используете виртуальный путь для расположения файла ASCX. (в вашем примере вы бы использовали "~ / indDemographics.ascx" , если ASCX был в корне сайта). На этом этапе вам нужно добавить его на страницу (или заполнитель или какой-либо другой контейнерный объект).

Независимо от того, каким образом вы создаете экземпляр UserControl, вы затем связываете обработчик события с событием экземпляра класса. Например:

Dim btn As New Button;
AddHandler btn.Click, AddressOf MyButtonClickEventHandler

Теперь по той причине, что вы получаете пустую ссылку в примере кода.

Когда вы используете ссылку LoadControl, экземпляр вашего объекта находится в переменной UC . В этом примере вы объявляете два объекта, UC как тип UserControl и indDemographics как тип indDemographics.

Когда вы используете LoadControl, вы создаете экземпляр экземпляра indDemographics и присваиваете его UC. Когда вы пытаетесь присвоить обработчик события переменной IndDemographics, он фактически никогда не создавался.

В конечном итоге ваш код должен выглядеть примерно так:

protected indDemographics IndDemographics;
override protected void OnInit(EventArgs e)
{
    indDemographics = LoadControl("~/indDemographics.ascx");
    IndDemographics.Bind += new EventHandler(test_handler);
    base.OnInit(e);
}
1 голос
/ 05 декабря 2008

Спасибо Стивену за то, что он направил меня по правильному пути. Вот последний рабочий код в C #:

protected indDemographics IndDemo;
override protected void OnInit(EventArgs e)
{
    Control c = LoadControl("~/indDemographics.ascx");
    IndDemo = (indDemographics) c;
    IndDemo.Bind += new EventHandler(test_handler);
    place1.Controls.Add(IndDemo);
    base.OnInit(e);
}

Важно привести общий элемент управления в класс indDemographics. После этого все остальное работает нормально.

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

Я вижу, что он (IndDemographics) объявлен, но фактически не создан, поэтому я ожидаю, что он будет нулевым только с этим кодом.

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