有没有办法知道在PageLoad事件中是否按下了控件?

时间:2011-06-29 16:38:18

标签: c# asp.net events

我以编程方式创建了2个按钮。现在我想知道在pageLoad时间按了哪一个....按钮将触发页面加载事件然后它自己的事件..

在它触发自己的事件之前,我想知道页面加载事件是否按下了哪个按钮。

有没有办法找出来?

我的按钮就像这样

   Button btnMoveThread = new Button();
        btnMoveThread.Text = "1";
        btnMoveThread.Command += ModeratorButtonPassTo_Click;

   Button btnMoveThread = new Button();
        btnMoveThread.Text = "2";
        btnMoveThread.Command += ModeratorButtonPassTo_Click;

此功能不起作用:

 public static System.Web.UI.Control GetPostBackControl(System.Web.UI.Page page)
    {
        Control control = null;
        string ctrlname = page.Request.Params["__EVENTTARGET"];
        if (ctrlname != null && ctrlname != String.Empty)
        {
            control = page.FindControl(ctrlname);
        }
        // if __EVENTTARGET is null, the control is a button type and we need to 
        // iterate over the form collection to find it
        else
        {
            string ctrlStr = String.Empty;
            Control c = null;
            foreach (string ctl in page.Request.Form)
            {
                // handle ImageButton controls ...
                if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
                {
                    ctrlStr = ctl.Substring(0, ctl.Length - 2);
                    c = page.FindControl(ctrlStr);
                }
                else
                {
                    c = page.FindControl(ctl);
                }
                if (c is System.Web.UI.WebControls.Button ||
                            c is System.Web.UI.WebControls.ImageButton)
                {
                    control = c;
                    break;
                }
            }
        }
        return control;
    }

3 个答案:

答案 0 :(得分:1)

您可以通过在调用事件处理程序之前确定哪个控件导致回发来确定这一点。 e.g。

string sender = page.Request.Params.Get("__EVENTTARGET");
Response.Write(sender);        

答案 1 :(得分:0)

ASP.NET回发的工作原理是提交一个客户端表单,其中包含两个附加值__EVENTTARGET__EVENTARGUMENT。 ASP.NET使用这些来确定要查找的控件以及要触发的事件。你可以这样做:

if (IsPostBack)
{
    string controlId = Request["__EVENTTARGET"];
    // Do something with the control Id.
}

答案 2 :(得分:0)

您需要在回发之前添加按钮,以便在回发期间可以访问它们,可能是在页面的INIT中。我更改了它,因此它会编译并向按钮添加ID属性:

    Button btnMoveThread = new Button();
    btnMoveThread.Text = "1";
    btnMoveThread.ID = "Thread1";
    btnMoveThread.Command += ModeratorButtonPassTo_Click;
    DivContent.Controls.Add(btnMoveThread);

    Button btnMoveThread2 = new Button();
    btnMoveThread2.Text = "2";
    btnMoveThread2.ID = "Thread2";
    btnMoveThread2.Command += ModeratorButtonPassTo_Click;
    DivContent.Controls.Add(btnMoveThread2);

然后,在您的函数中,您需要遍历request.form的键:

    int KeyCount = page.Request.Form.AllKeys.Length;
    for (int i = 0; i < KeyCount; i++)
    {
        if (page.Request.Form.AllKeys[i] == "Thread1")
        {
            return page.FindControl("Thread1");
        }
        if (page.Request.Form.AllKeys[i] == "Thread2")
        {
            return page.FindControl("Thread2");
        }
    }

由于您是在代码中而不是在设计器中添加按钮,因此除非您在回发之前将其添加回来,否则查找控件将为null,就像我在页面的INIT中建议的那样。