C# 在同一控件的另一个onclick中防止onclick

C# 在同一控件的另一个onclick中防止onclick,c#,asp.net,event-handling,onclick,C#,Asp.net,Event Handling,Onclick,我有一个带有onclick事件的按钮 <asp:Button ID="btn_Save" runat="server" Text="Save" OnClick="btn_Save_Click"/> 我调试后发现第一个出现在第二个之前 我想取消第一次的第二次点击 为什么我需要2次点击事件: 我有一个webcontrol(BulkEditGridView),它将Button控件作为参数,该控件保存整行。第二次单击事件充当保存整个表。现在,我在webcontrol中添加了一些字段,我希望

我有一个带有onclick事件的按钮

<asp:Button ID="btn_Save" runat="server" Text="Save" OnClick="btn_Save_Click"/>
我调试后发现第一个出现在第二个之前

我想取消第一次的第二次点击

为什么我需要2次点击事件:
我有一个webcontrol(BulkEditGridView),它将Button控件作为参数,该控件保存整行。第二次单击事件充当保存整个表。现在,我在webcontrol中添加了一些字段,我希望在单击按钮时阻止保存。由于无法修改WebControl事件处理程序(第二次单击事件),因此添加了第一个onclick事件。我想做的是,如果其中一个字段(例如:文本框字段)为空,则阻止保存gridview,这可以通过阻止默认的单击事件来完成。

我不知道是否正确理解了您的查询

((Button)btn).Click -= new EventHandler(SaveClicked);
使用删除第一个方法-= 然后添加第二个方法,然后再次添加第一个方法

因此,您将首先执行第二个方法


同样,不确定,只需从按钮单击事件中删除第二个事件处理程序

((Button)btn).Click -= new EventHandler(SaveClicked);
但当您不需要第二个事件处理程序时,为什么要添加它

您也可以通过反射删除事件处理程序,您可以尝试此代码,但未经测试

BindingFlags AllBindings = BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;

List<FieldInfo> lst = new List<FieldInfo>();

foreach (EventInfo ei in btn.GetType().GetEvents(AllBindings))
{
    Type dt = ei.DeclaringType;
    FieldInfo fi = dt.GetField(ei.Name, AllBindings);
    if (fi != null)
        lst.Add(fi);
}

foreach (FieldInfo fi in lst)
{
    EventInfo ei = btn.GetType().GetEvent(fi.Name, AllBindings);
    if (ei != null)
    {
        object val = fi.GetValue(btn);
        Delegate mdel = (val as Delegate);
        if (mdel != null)
        {
            foreach (Delegate del in mdel.GetInvocationList())
                ei.RemoveEventHandler(btn, del);
        }
    }
}
BindingFlags AllBindings=BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
List lst=新列表();
foreach(btn.GetType().GetEvents中的EventInfo ei(所有绑定))
{
dt型=ei.去极化型;
FieldInfo fi=dt.GetField(ei.Name,所有绑定);
如果(fi!=null)
一加二(fi);
}
foreach(第一层中的FieldInfo fi)
{
EventInfo ei=btn.GetType().GetEvent(fi.Name,AllBindings);
如果(ei!=null)
{
对象值=fi.GetValue(btn);
委托mdel=(val作为委托);
如果(mdel!=null)
{
foreach(mdel.GetInvocationList()中的委托del)
ei.移除Venthandler(btn,del);
}
}
}

它将删除所有事件处理程序。有关详细信息,您可以查看此链接。

是否需要编写此事件处理程序,这会导致在
btn\u Save\u Click
中再次单击另一个按钮。您可以删除此行或更改代码行的顺序……它们不在同一类中,因此“SaveClicked”从第一次点击看不到。