如何以编程方式从cs文件访问aspx页面上的控件?
例如,如果我有一组asp:Panel控件,每个控件都有一个由城市命名的ID(id =“atlanta”,id =“chicago”,id =“pittsburgh”等),然后在cs我从数据库中获取一个值以匹配控件名称我将使用什么?
我尝试使用FindControl(),如图所示,它返回null。
aspx页面:
<asp:Panel ID="atlanta" runat="server" Visible="false"></asp:Panel>
cs文件:
controlName = storeLocation.City.ToLower();
Panel cityPanel = (Panel)FindControl(controlName);
cityPanel.Visible = true;
我认为FindControl()实际上适用于传递ItemTemaplate的Repeater或Grids。就我而言,它只是一个简单的内容页面,内容标签中包含一堆面板。
先谢谢了! :)
答案 0 :(得分:3)
FindControl()
不是递归的,这可能是你的问题。但是,有许多递归版本的实现,例如this one。
如果您要动态创建面板并希望在页面生命周期中稍后访问它们,则可以将它们全部添加到ID为关键字的Dictionary<string, Panel>
。
答案 1 :(得分:2)
您可以使用此扩展方法递归查找控件:
public static class ControlExtension
{
public static IEnumerable<Control> GetAllControls(this Control parent)
{
foreach (Control control in parent.Controls)
{
yield return control;
foreach (Control child in control.GetAllControls())
{
yield return child;
}
}
}
}
然后在您的代码隐藏页面中,如果您在标签前添加前缀,则可以执行以下操作:
IEnumerable<Control> city_controls = this.GetAllControls().Where(x => x.Id.Contains("city_"))
或单一控件:
var city = this.GetAllControls().Single(x => x.Id = "atlanta");
this
是您页面背后的ASPX代码。
它也适用于面板等控件,所以如果你想在面板中找到所有控件等等。
答案 2 :(得分:1)
如果您知道包含控件,则可以使用该控件的FindControl()
函数来查找它。与使用递归方法相比,此方法更快,更安全。
Microsoft出于某种原因没有包含递归FindControl()
函数,随着更多控件添加到页面中,它会减慢页面的速度。如果这不起作用,请使用递归函数,如建议的其他响应。
答案 3 :(得分:1)
这应该适合您,因为面板嵌套在 asp:Content 控件中。
Panel cityPanel =
(Panel)Master.FindControl("ContentPlaceHolderId").FindControl(controlName);
如果偏离,ContentPlaceHolderId是您正在实施的母版页中相应ContentPlaceHolder的ID。