阻止Page_Load()上的其他事件

时间:2014-11-26 11:38:15

标签: c# asp.net .net

我有一个如下情况。

protected void Page_Load(object sender, EventArgs e)
{
    if (SomeCheck())
    { 
        // Block all other events from happening
    }
}
protected void Button1_Click(object sender, EventArgs e)
{

}
protected void Button2_Click(object sender, EventArgs e)
{

}
protected void Button3_Click(object sender, EventArgs e)
{

}
//..
//..
// Other Event Handlers
//..
//..

我有多个事件处理程序,例如按钮点击这里(在上面的示例中)并且有Page_Load我要检查某些内容并根据该检查我要阻止其他发生的事件。 我怎样才能做到这一点?我在这里使用正确的活动还是应该在Pre_render或其他地方检查?

更新

我实际上想要一个解决方案,我不需要做任何额外的代码或担心检查每次我添加一个新的事件处理程序检查每个事件处理程序上的bool变量将很快在代码维护中变得困难。

2 个答案:

答案 0 :(得分:1)

尝试此功能可以从作为输入传递的通用按钮中删除点击处理程序

private void RemoveClickEvent(Button b)
{
   FieldInfo f1 = typeof(Control).GetField("EventClick", 
   BindingFlags.Static | BindingFlags.NonPublic);
   object obj = f1.GetValue(b);
   PropertyInfo pi = b.GetType().GetProperty("Events",  
   BindingFlags.NonPublic | BindingFlags.Instance);
   EventHandlerList list = (EventHandlerList)pi.GetValue(b, null);
   list.RemoveHandler(obj, list[obj]);
}

此代码来自MSDN

<强>更新

在谷歌搜索不同的问题后,我试着为你的问题制作一个谜题:

逻辑是:从页面获取所有控件并获取其事件,为每个事件销毁它

foreach (var control in this.Page.Form.Controls)
    {
        foreach(var event in control.GetType.GetEvents()){
            ClearEventInvocations(control, evt.Name);
        }
    }

功能

public static void ClearEventInvocations(this object obj, string eventName)
    {
        var fi = obj.GetType().GetEventField(eventName);
        if (fi == null) return;
        fi.SetValue(obj, null);
    }

    private static FieldInfo GetEventField(this Type type, string eventName)
    {
        FieldInfo field = null;
        while (type != null)
        {
            /* Find events defined as field */
            field = type.GetField(eventName, BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
            if (field != null && (field.FieldType == typeof(MulticastDelegate) || field.FieldType.IsSubclassOf(typeof(MulticastDelegate))))
                break;

            /* Find events defined as property { add; remove; } */
            field = type.GetField("EVENT_" + eventName.ToUpper(), BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
            if (field != null)
                break;
            type = type.BaseType;
        }
        return field;
    }

代码未经过测试,如果有错误,请原谅我。我想尝试给你正确的方法来解决你的问题。缺少的一件事可能是对父母控制的父母的反复召唤

感谢this其他答案

答案 1 :(得分:0)

假设这些都是用户创建的事件:DropDownList s,Button等。 您应该更改连接事件的方式,只添加您需要的方式。

删除所有活动,例如来自.aspx页面的OnClick="clickEventName"并将其移至后面的代码中。

protected void Page_Load(object sender, EventArgs e)
{
    Button1.Click += Button1_Click;

    if (!SomeCheck())
    { 
        // Only fire Button2 Click if SomeCheck Fails
        Button2.Click += Button2_Click;

    }
}
protected void Button1_Click(object sender, EventArgs e)
{

}
protected void Button2_Click(object sender, EventArgs e)
{

}

我个人认为这是连接控制事件而不是使用页面的更好方法。