【问题标题】:Failing to add controls to a page dynamically无法动态向页面添加控件
【发布时间】:2010-10-17 03:50:27
【问题描述】:

我正在为数据读取器中提取的每条记录添加一个用户控件,这是基本循环:

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/sets 设置它们?

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

编辑 3: 在有和没有构造函数的情况下尝试了这个方法之后。我发现只对我希望控件具有的任何属性使用设置器比尝试为我的构造函数使用传入的对象数组更好。

【问题讨论】:

  • @Neil 有可能,发布了我的答案的更新。
  • 请记住,重载与另一个重载的工作方式不同,因此如果您有设计器项目,您可能会遇到空引用异常。如果需要,我的博客上有一个扩展方法可以解决它。
  • 在尝试了传入的参数后,我认为 Freddies 关于使用 setter 的建议是更好的选择。

标签: c# asp.net user-controls


【解决方案1】:

更新: 正如史蒂夫指出的那样,使用该类型的 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/

我的看法是带有类型的 LoadControl 旨在与 Web 自定义控件一起使用。


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

您可以通过以下方式使用构造函数:

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

请注意,根据您使用的项目模型,您需要添加对 aspx 的引用以将其与 typeof 变体一起使用:

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

附言。我通常使用 set/get 进行控件,因为我发现它们更符合 asp.net 模型

【讨论】:

  • 你能扩展一下吗? .负载什么?页面?
  • @Neil y,更新它,内存失败,它是 LoadControl 并且您指定了用户控件的路径,如:“~/somepath/mycontrol.ascx”
  • 好的,知道了,现在我可以使用构造函数参数 LoadControl 了吗,就像我在原始示例中所做的那样?
  • 好的,太好了,错过了智能感知中 LoadControl 的重载。感谢您的解释。
  • 请记住,重载与另一个重载的工作方式不同,因此如果您有设计器项目,您可能会遇到空引用异常。如果需要,我的博客上有一个扩展方法可以解决它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-04
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多