2015-06-23 2 views
2

у меня есть вопрос, похожий на тот, публикуемую здесь: Event fires more and more timesособых событий стрельбы несколько раз

Однако решение не работает для меня. У меня есть дочерний элемент управления, который вызывает событие при нажатии кнопки и прослушиватель на родительской странице. Когда происходит событие клика и вызывается событие, оно срабатывает несколько раз на родительской странице. Каждый раз увеличивается на единицу.

Загрузка страницы (на родителях) и нажатия кнопки (на дочернем) события срабатывает только один раз, только метод событий работает несколько раз.

управления пользователя

public delegate void QuickViewClickEventHandler(int jobId, int bayId); 

public static event QuickViewClickEventHandler QuickViewClicked; 

protected void QuickViewLinkButton_OnClick(object sender, EventArgs e) 
{ 
    // code removed for clarity 
    OnQuickViewClicked(jobId, bayId); 
} 

protected void OnQuickViewClicked(int jobId, int bayId) 
    { 
     var handler = QuickViewClicked; 
     if (handler != null) 
     { 
      handler(jobId, bayId); 
     } 
    } 

Родительская страница

<asp:Repeater runat="server" ID="BayRepeater" OnItemDataBound="BayRepeaterStuff_ItemDataBound"> 
    <ItemTemplate> 
     <uc:BayViewItem ID="BayViewItemControl" runat="server" /> 
    </ItemTemplate> 
</asp:Repeater> 

protected void Page_Load(object sender, EventArgs e) 
{ 
    BayViewItem.QuickViewClicked += BayViewItem_QuickViewClicked; 
} 

private void BayViewItem_QuickViewClicked(int jobId, int bayId) 
{ 
    // code removed for clarity 

    // unregistering the event seems to work but only after the first time 
    // initial page load will still cause it to fire multiple times 
    BayViewItem.QuickViewClicked -= BayViewItem_QuickViewClicked; 
} 

ответ

1

Ваш код выглядит хорошо. Только после очередной проверки я вижу, что происходит не так.

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

Так что вам нужно TODO это сделать обработчик события нестатическим:

public event QuickViewClickEventHandler QuickViewClicked; 

Вашей страницы вашего Page_Load должен быть таким, где вы используете экземпляр пользовательского элемента управления:

protected void Page_Load(object sender, EventArgs e) 
{ 
    BayViewItemInstance.QuickViewClicked += BayViewItem_QuickViewClicked; 
} 

EDIT : Я пропустил, что элемента управления не было на странице, а в репитере. Таким образом, чтобы добиться такого же результата с ретранслятором (но то же самое можно сделать на странице, не делая этого в Page_Load), устанавливается значение OnQuickViewClicked (On + EventHandler-name), которое эквивалентно .QuickViewClicked + = в кодировке:

<asp:Repeater runat="server" ID="BayRepeater" OnItemDataBound="BayRepeaterStuff_ItemDataBound"> 
    <ItemTemplate> 
     <uc:BayViewItem ID="BayViewItemControl" runat="server" OnQuickViewClicked="BayViewItem_QuickViewClicked" /> 
    </ItemTemplate> 
</asp:Repeater> 

Теперь вам не нужно отменить что-нибудь, так как обработчик события не находится в статическом объеме:

private void BayViewItem_QuickViewClicked(int jobId, int bayId) 
{ 
    // code removed for clarity 

    // unregistering the event seems to work but only after the first time 
    // initial page load will still cause it to fire multiple times 
    //BayViewItem.QuickViewClicked -= BayViewItem_QuickViewClicked; 
} 
+0

да, но как получить доступ к нестатическому событию в статическом контексте (ошибка Я получаю)? – tqrecords

+0

Зачем вам нужен доступ к нему из статического контекста? В моем примере вам не нужно. Вы не отправили никаких ошибок, просто описали поведение. Пожалуйста, разместите свою ошибку, если она у вас есть. – Dacker

+0

Ошибка: «не удается получить доступ к статическому событию в статическом контексте». Это когда я удаляю статическое свойство из пользовательского элемента управления и пытаюсь получить доступ к событию с родительской страницы. – tqrecords

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