如何以编程方式从cs文件访问aspx页面上的控件

时间:2012-03-29 20:53:53

标签: c# asp.net .net

如何以编程方式从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。就我而言,它只是一个简单的内容页面,内容标签中包含一堆面板。

先谢谢了! :)

4 个答案:

答案 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。