2013-05-23 3 views
0

Я строю управления сервера с пользовательскими событиями и как пример использовали этот MSDN reference .Но события никогда не стреляли, а постбэк - clickEventDelegate всегда нуль:Postback делегат нуль

 if (clickEventDelegate != null) 
     { 
      clickEventDelegate(this, e); 
     } 

Вот как я добавить делегат:

 if (!Page.IsPostBack) 
    { 
      ..... 
     MYCONTROL.LeftClick+= FUNCTION; 
    } 

Любые идеи?

ответ

1

Вы не разместили достаточно своего кода, чтобы узнать, почему ваше событие равно null. Но я собираюсь перечислить стандартный образец.

Это, как вы определяете класс аргументов для пользовательского события:

public class MyEventArgs : EventArgs 
{ 
    private string MyField { get; private set; } 

    public MyEventArgs(string myField) 
    { 
     MyField = myField; 
    } 
} 

Это как определить пользовательское событие:

public event EventHandler<MyEventArgs> MyEvent; 

Это, как вы пишете рейзер событие в тот же класс, что и событие:

protected virtual void OnMyEvent(MyEventArgs e) 
{ 
    EventHandler<MyEventArgs> myEvent = MyEvent; // for thread safety 
    if (myEvent != null) 
    { 
     myEvent(this, e); 
    } 
} 

Так вы поднимите событие в классе, который он определен в (Или производный класс):

OnMyEvent(new MyEventArgs("Test")); 

Это, как вы реагировать на события в производном классе:

protected override void OnMyEvent(MyEventArgs e) 
{ 
    // TODO: Here you react to your event. 
    base.OnMyEvent(e); 
} 

Это, как вы зарегистрироваться на мероприятии в иностранном классе:

otherClass.MyEvent += delegate(object sender, EventArgs e) 
{ 
    // TODO: Here you react to your event. 
}; 
1

Другой ответ просто объясняет, как работают события, но полностью игнорирует основную точку вопроса: Делегат является нулевым во время обратной передачи

Ответ был довольно прост. Просто подписаться на событие каждый раз, даже во время Postback, так что вы просто должны были удалить ваше состояние if (!Page.IsPostBack)

MYCONTROL.LeftClick+= FUNCTION; 

Я знаю, что это очень старый вопрос, и нет никакого способа, вы все еще ищете ответ. Но когда я прочитал

Вы не отправляли достаточно ваш код, чтобы узнать, почему событие нулевого

из предыдущего ответа я не мог позволить это неправильному подобному заявлению.

EDIT:

Чтобы добавить больше объяснений, каждый раз, когда сервер возвращает последнюю страницу, которые будут отображены в браузере он затем теряет состояние этого конкретного соединения. Представьте себе, должен ли сервер хранить в памяти все соединения с их ассоциированными состояниями, у вас могут быть тысячи пользователей в день, а также когда «чистить» эту память?

Таким образом, это не будет выполнено, поэтому они создали ViewState, чтобы браузер мог отправлять предыдущую информацию на сервер. Однако этот ViewState может сохранять значения некоторых переменных или объектов, но не сохраняет привязку между событием и его делегатом.

Назад к конкретным примерам. Если вы сделаете это

<asp:Button runat="server" ID="ButtonTest" OnClick="buttonTest_Click" Text="test" /> 

Подписка на события производится внутри ASP.NET, на очень ранней стадии жизненного цикла, прежде чем достичь данной страницы Page_Load. Вы можете прочитать о жизни ASP.NET цикла here

Если назначить обработчик события, как этот

<asp:Button runat="server" ID="ButtonTest" Text="test" /> 

и на серверной стороне вашей страницы:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ButtonTest.Click += ButtonTest_Click; 
} 

Он будет работать так же, за исключением того, что подписка будет сделана чуть позже.

Но если вместо этого вы украсить его в состоянии

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     ButtonTest.Click += ButtonTest_Click; 
    } 
} 

Это не будет работать, так как обработчик события не был назначен. Помните, что ваш сервер забыл состояние этого конкретного соединения и должен инициализировать все при каждом запросе HTTP POST (PostBack).

Это точно так же, как в примере кода вашего вопроса, так как вы можете видеть, что события работают одинаково на собственных элементах управления ASP.NET или пользовательских объявленных вами.

+0

Я подтверждаю, что подписываться каждый раз, когда он будет отправлен обратно, будет работать. Но почему это работает именно так, и как насчет события по умолчанию, такого как Click, следует подписаться на пост или нет? – zquanghoangz

+0

@zquanghoangz Я отредактировал свой ответ. –

Смежные вопросы