gpt4 book ai didi

c# - 无法动态地向页面添加控件

转载 作者:行者123 更新时间:2023-11-30 20:14:16 25 4
gpt4 key购买 nike

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

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:在使用和不使用构造函数的情况下尝试此方法之后。我发现最好只对我希望控件具有的任何属性使用 setter,而不是尝试对我的构造函数使用传入的对象数组。

最佳答案

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

关于c# - 无法动态地向页面添加控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/710396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com