防止在同一控件的另一个onclick内点击

时间:2012-08-28 11:35:50

标签: c# asp.net event-handling onclick

我有一个带onclick事件的按钮

<asp:Button ID="btn_Save" runat="server" Text="Save" OnClick="btn_Save_Click"/>

我有这个按钮的第二个onclick事件,因为它可以在下面看到。

((Button)btn).Click += new EventHandler(SaveClicked);

我调试并看到第一个发生在第二个之前,

我想从第一个中取消第二个onclick。

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

3 个答案:

答案 0 :(得分:2)

只需从按钮点击事件中删除第二个事件处理程序。

((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);
        }
    }
}

它将删除所有事件处理程序。有关详细信息,请查看此链接http://www.codeproject.com/Articles/103542/Removing-Event-Handlers-using-Reflection

答案 1 :(得分:0)

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

使用 - =删除第一个方法 然后添加第二个方法,然后再添加第一个方法。

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

再次,不确定

答案 2 :(得分:0)

可以使用会话变量。