【问题标题】:How to find a panel and add control to it from it's code behind如何从其背后的代码中找到一个面板并为其添加控件
【发布时间】:2013-03-20 21:13:18
【问题描述】:

在一个母版页中,我有一个面板,我想从母版页后面的代码中向它添加控件,如下所示:

var cphRegionName = this.Page.FindControl("pnlLeft") as Panel;
cphRegionName.Controls.Add(uc);

但我收到此错误:

对象引用未设置为 cphRegionName.Controls.Add(uc) 处的对象实例;

我已经尝试了所有可能的其他方法,但得到了同样的错误。

我使用 FindControl 访问面​​板的原因是面板的名称是动态的(“pnlLeft”),从数据库中读取。

【问题讨论】:

    标签: c# asp.net .net master-pages findcontrol


    【解决方案1】:

    FindControl 方法不能递归工作。这意味着除非您的控件直接添加到页面,否则它不会找到它。

    如果您知道容器控件,请在该控件上使用 FindControl,而不是在页面上使用。

    如果你不这样做,你可以使用这样的函数来解决问题

    private Control FindControlRecursive(Control root, string id) 
    { 
        if (root.ID == id)
        { 
            return root; 
        } 
    
        foreach (Control c in root.Controls) 
        { 
            Control t = FindControlRecursive(c, id); 
            if (t != null) 
            { 
                return t; 
            } 
        } 
    
        return null; 
    } 
    

    【讨论】:

    • 嗨,这正是我需要知道的。非常感谢:)
    • 就像调用页面上的任何函数一样。如果周围没有面板或其他容器控件,此方法可以搜索整个控件层次结构,var control = FindControlRecursive(this, "idToFind")
    【解决方案2】:

    FindControl 不是递归的,因此您必须确保在正确的容器上调用它。看起来面板不是基于空引用在根目录定义的。 尝试在面板的父级上调用 FindControl

    【讨论】:

    • 您可以对其进行递归搜索,但如果面板出现在控件层次结构中的位置是可预测的,我建议避免这样做。
    • @nunespascal, @TGH, 嗨,事实上我正在向我的网站添加模块化功能,所以我添加了一些表格,例如 Modules、ModuleSettings、Panels、PanelSettings、PanelModules、PanelModuleSetting,现在我正在尝试将用户定义的内容添加到母版页中的指定面板。也许我尝试的方式不是最好的解决方案,但这是我第一次这样做。如果你有这方面的经验,我会很感激听到你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-09
    • 2022-07-26
    • 1970-01-01
    • 2017-01-11
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多