假设我有一个带有几个按钮的用户控件。我想知道哪一个引起了回发,使用这种方法:
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()也在用户控件的代码隐藏中。
答案 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;
}