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

本文关键字:是否 控件 事件 PageLoad 有没有 | 更新日期: 2023-09-27 18:00:46

我以编程方式创建了两个按钮。现在我想知道页面加载时按下了哪个。。。。该按钮将触发页面加载事件,然后触发其自身的事件。。

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

有办法找到答案吗?

我的按钮像这个

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

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

您可以通过在调用哪个控件的事件处理程序之前识别导致回发的控件来确定这一点。例如

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

ASP.NET回发通过提交具有两个附加值__EVENTTARGET__EVENTARGUMENT的客户端表单来工作。ASP.NET使用这些控件来确定要查找的控件以及要激发的事件。你可以做:

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

您需要在返回之前添加按钮,以便在返回期间访问它们,可能是在页面的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);

然后,在您的函数中,您需要迭代请求的密钥。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");
        }
    }

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