我真的不了解Page.FindControl

本文关键字:FindControl Page 不了解 真的 | 更新日期: 2023-09-27 18:34:00

我有这样的图像:

<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[]>
相反,但

当然它不是动态的,因为添加新页面意味着必须添加到字典中,但我想现在没关系......

我真的不了解Page.FindControl

用于FindControl的重载仅查看直接子控件 - 如果它嵌套得更深,则找不到该控件。

还有另一个重载,它允许您提供函数应经历多少个嵌套级别 - 这使您可以更深入地挖掘(以成本 - 性能)。

由于您可以简单地执行btnabout1.Visible = false;,因此在这种情况下无需使用FindControl

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

如果您使用的是母版页,请尝试使用以下内容:

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

使用如下方法

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

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