代码之家  ›  专栏  ›  技术社区  ›  Neil N HLGEM

无法将控件动态添加到页面

  •  2
  • Neil N HLGEM  · 技术社区  · 17 年前

    while (dr.Read())
    {
         ImageSelect imgSel = new ImageSelect(dr["Name"].ToString());
         myPanel.Controls.Add(imgSel);
    }
    

    问题是没有控件添加到页面,我检查html输出,有我的面板,里面什么都没有。

    我甚至在调试器中仔细检查了代码,并验证了myPanel.Controls在每个循环中都添加了一个控件,计数为6,没有错误,但是它们不会显示在页面上。

    我在Page_Init和Page_Load事件中运行了上述代码,两者的结果相同。

    编辑: 好的,我已经切换到使用LoadControl(“…ascx”)来获取我的控件实例,它现在正在工作。但最初我也是通过控件构造函数传递数据的。。这仍然是可能的,还是我只需要通过get/set设置它们?

    感谢Freddy指出LoadControl有一个重载,您可以在其中传递构造函数参数,请参阅接受的答案。

    编辑3: 在使用和不使用构造函数尝试此方法之后。我发现,对于我希望控件具有的任何属性,只使用setter比尝试为构造函数使用传入的对象数组更好。

    2 回复  |  直到 17 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    更新: 正如Steve指出的,使用该类型的LoadControl重载不会考虑ascx中的控件。这个答案中也提到了这一点: Dynamically Loading a UserControl with LoadControl Method (Type, object[]) .

    正如我前面提到的,get/set更符合asp.net模型,因此我建议将其与接收用户控件路径的LoadControl变体一起使用。也就是说,史蒂夫的版本是一个有趣的选择: http://www.grumpydev.com/2009/01/05/passing-parameters-using-loadcontrol/ .

    My take是类型为的LoadControl,用于web自定义控件。


    如果是用户控件,则应使用LoadControl(usercontrolpath)获取用户控件的实例。

    您可以通过执行以下操作来使用构造函数:

    var name = dr["Name"].ToString();
    var imgSel = LoadControl(typeof(ImageSelect), new object[]{ name });
    myPanel.Controls.Add(imgSel);
    

    <%@ Reference Control="~/somepath/myusercontrol.ascx" %>
    

    另外,我通常对控件使用set/get,因为我发现它们更符合asp.net模型

        2
  •  3
  •   Daniel    17 年前

    要添加UserControls,必须调用LoadControl方法,并将路径传递到.ascx文件。您不能仅通过实例化.ascx文件继承自的对象来创建它们。

    UserControl由代码隐藏中的标记和类组成。标记包含指向后面的类的链接,但后面的类不知道标记所在的位置,因此无法自行创建。