【问题标题】:How to programmatically access a control on a aspx page from the cs file如何以编程方式从 cs 文件访问 aspx 页面上的控件
【发布时间】:2012-03-29 20:53:52
【问题描述】:

如何以编程方式从 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 的中继器或网格等情况。在我的例子中,它只是一个带有内容标签的简单内容页面,里面有一堆面板。

【问题讨论】:

  • 你检查我的答案了吗?我在我的机器上试过了,它似乎可以工作。我很好奇……

标签: c# asp.net .net


【解决方案1】:

FindControl() 不是递归的,这可能是您的问题。不过递归版本有很多实现,比如this one

如果您正在动态创建面板并且希望在页面生命周期的后期访问它们,您可以将它们全部添加到以 ID 为键的Dictionary&lt;string, Panel&gt;

【讨论】:

  • 谢谢,这绝对有效。正如其他人所指出的那样,递归可能很费力,但当前状态下的 aspx 页面结构应该不是问题。如果它发生变化并变得更复杂,这可能是一个问题,但我预计此页面除了复制/文本之外不会发生变化。
  • 很高兴它有效。如果您知道所有项目的直接父项,则可以避免递归,否则我不会担心。通过几个级别的控件进行递归非常便宜。
【解决方案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 代码隐藏页面。

它也适用于面板等控件,因此如果您想在面板等中查找所有控件。

【讨论】:

    【解决方案3】:

    如果您知道包含控件,则可以使用该控件的FindControl() 函数来查找它。这种方法将比使用递归方法更快、更安全。

    Microsoft 没有包含递归 FindControl() 函数是有原因的,随着更多控件被添加到页面中,它会随着时间的推移减慢您的页面速度。如果这不起作用,请使用类似于其他响应建议的递归函数。

    【讨论】:

    • 我也遇到了这个问题。尝试在包含的内容占位符上执行 FindControl() 也会返回 null。
    【解决方案4】:

    这应该对你有用,因为面板嵌套在 asp:Content 控件中。

        Panel cityPanel =
    (Panel)Master.FindControl("ContentPlaceHolderId").FindControl(controlName);
    

    当然,ContentPlaceHolderId 是您正在实施的母版页中相应 ContentPlaceHolder 的 Id。

    【讨论】:

    • 我无法让它工作。所以如果我在 aspx 中有这个:&lt;asp:Content ID="Content1" ContentPlaceHolderID="cphInteriorBody" Runat="Server"&gt; 我应该在 cs 中有这个:Panel concentrationPanel = (Panel)Master.FindControl("cphInteriorBody").FindControl(controlName);
    • @DMase05 是的,这就是我使用的方式,它对我有用,很抱歉它对你不起作用。正如您在其他答案中所说,递归肯定会起作用。
    • 是的,我真的对此感到困惑,因为我希望它也能正常工作。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多