1

我有这样的图像:

<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[]>

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

4

3 回答 3

0

使用如下方法

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

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

于 2012-05-12T09:24:03.480 回答
0

您正在使用的重载FindControl只查看直接子控件 - 如果它嵌套得更深,则不会找到该控件。

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

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

于 2012-05-12T09:20:55.937 回答
0

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

如果您使用的是母版页,请尝试使用:

ContentPlaceHolder h = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolderName");
h.FindControl("");
于 2012-05-12T09:21:07.933 回答