2015-06-23 164 views
2

我有一个类似张贴在这里的一个问题:Event fires more and more times自定义事件触发多次

但是该解决方案并没有为我工作。我有一个子控件,在按钮单击时触发一个事件,在父页面上有一个侦听器。当发生点击事件并且调用该事件时,它会在父页面上多次触发。每次递增1。

页面加载(在父级上)和按钮点击(在子级上)事件只触发一次,它只是事件方法运行多次。

用户控制

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

您的代码看起来不错。只有经过另一次检查,我才看到出了什么问题。

在你的页面中,你有一个用户控件的实例。您应该订阅该用户控件的事件处理程序,因此它只会处于您的页面范围内。如果你这样做,你不会冒险多次发射同一个事件,因为有人也同时请求这个页面。没有理由为什么这个事件应该是静态的,基本上使这个静态导致这些问题。

因此,你需要什么待办事项是让你的事件处理程序的非静态:

public event QuickViewClickEventHandler QuickViewClicked; 

你的页面,您使用的用户控件的实例你的Page_Load应该是这样的:

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

编辑: 我错过了控制不在页面中,但在中继器。因此,要实现与中继器相同的功能(但是可以在页面中完成相同的操作,而不是在Page_Load中完成),请设置OnQuickViewClicked(On + EventHandler名称),该代码相当于.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