我真的不了解Page.FindControl

时间:2012-05-12 09:08:45

标签: c# asp.net controls

我有这样的图像:

<asp:Image runat="server" ID="btnabout1" ImageUrl="~/graphics/buttons/btnabout1.png" AlternateText="About" />

我可以像这样(显然)从代码隐藏中访问控件:

btnabout1.Visible = false;

但这不起作用:

Page.FindControl("btnabout1").Visible = false;

重点是使用变量controlID并设置属性。

我想我错误地理解了这个方法,所以有人可以启发我。


目的是创建一个方法,该方法获取当前页面的文件名并相应地设置图像/按钮可见/不可见。像这样:

string filename = System.IO.Path.GetFileName(HttpContext.Current.Request.FilePath);
string strippedfilename = filename.Substring(0, filename.IndexOf("."));
Page.FindControl("btn" + strippedfilename + "3").Visible = true;
Page.FindControl("btn" + strippedfilename + "2").Visible = false;
Page.FindControl("btn" + strippedfilename + "1").Visible = false;

由于我无法使Page.FindControl工作,我正在使用

Dictionary<string, Control[]>

相反,当然它不是那么动态,因为添加新页面意味着必须添加到字典中,但我想现在还可以......

3 个答案:

答案 0 :(得分:0)

您用于FindControl的重载仅查看直接子控件 - 如果它嵌套得更深,那么控件将无法找到。

还有另一个重载可以让你提供函数应该经过多少级别的嵌套 - 这可以让你更深入地挖掘(以成本 - 性能)。

由于您只需执行btnabout1.Visible = false;,因此无需在此方案中使用FindControl

答案 1 :(得分:0)

首先,我认为FindControl方法不是递归的。要使用此方法,您可能需要通过所有父cotrol(如面板或其他人)调用它。

如果您正在使用母版页,请尝试使用:

ContentPlaceHolder h = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolderName");
h.FindControl("");

答案 2 :(得分:0)

使用以下方法

Button btnAbout=(Button)Page.FindControl("btnAbout");
btnAbout.Visible=false;

这是使用此方法的正确方法。