如何在自己的代码中引用用户控件?

时间:2013-02-14 19:03:49

标签: asp.net user-controls

假设我有一个带有几个按钮的用户控件。我想知道哪一个引起了回发,使用这种方法:

public static Control GetPostBackControl(Page page)
    {
        Control control = null;

        string ctrlname = page.Request.Params.Get("__EVENTTARGET");
        if (ctrlname != null && ctrlname != string.Empty)
        {
            control = page.FindControl(ctrlname);
        }
        else
        {
            foreach (string ctl in page.Request.Form)
            {
                Control c = page.FindControl(ctl);
                if (c is System.Web.UI.WebControls.Button)
                {
                    control = c;
                    break;
                }
            }
        }
        return control;
    }

这就是我所说的:

string btn = GetPostBackControl(this.Page).ID;

我得到“对象引用未设置为对象的实例。”我现在知道问题来自于我正在使用 this.Page < / strong>,代表父页面

如何引用我所在的用户控件? (不是父页面)这样它可以使用该方法找到导致回发的按钮吗?

感谢您的帮助。

修改

两个按钮都位于用户控件内。 GetPostBackControl()也在用户控件的代码隐藏中。

1 个答案:

答案 0 :(得分:2)

我在你给定的代码上做了一个简单的例子,计算得非常好。也许你错过了检查 Page.IsPostBack?显然只有postBackControl,如果有postBack ...

@Buttons - 它们将呈现为<input type="submit">,因此它们不会显示在___EVENTTARGET中。这就是 Ryan Farlay his blog

中写道的原因
  

然而,你仍然可以以不同的方式实现它。自从   按钮(或输入)是导致表单提交的原因,它被添加到   表单集合中的项目以及来自的所有其他值   提交的表格。 [...]如果你愿意的话   在Form集合中查找任何按钮然后是那个   将是什么导致回发(假设它是一个按钮   导致页面提交)。如果您首先检查__EVENTTARGET ,那么   如果是空白,则在表单集合中查找按钮然后您   将找到导致回发的原因

protected void Page_Load(object sender, EventArgs e)
{
    if (Page.IsPostBack)
    {
        Control postBackControl = GetPostBackControl(this.Page);
        Debug.WriteLine("PostBackControl is: " + postBackControl.ID);
    }
}
public static Control GetPostBackControl(Page page)
{
    Control control = null;

    string ctrlname = page.Request.Params.Get("__EVENTTARGET");
    if (ctrlname != null && ctrlname != string.Empty)
    {
        control = page.FindControl(ctrlname);
    }
    else
    {
        foreach (string ctl in page.Request.Form)
        {
            Control c = page.FindControl(ctl);
            if (c is System.Web.UI.WebControls.Button)
            {
                control = c;
                break;
            }
        }
    }
    return control;
}