如何以编程方式创建一组Web用户控件?
我创建了一个Web用户控件。我已经知道如何在aspx文件中实现其中一个编码,但我想知道是否可以通过Page_Init()或Page_Load()事件中的代码执行此操作。
我已经知道aspx页面上的初始化。
<%@ Register TagPrefix="uc" TagName="myUsercontrol1" Src="/Controls/myUsercontrol1.ascx" %>
以传统方式,我会做类似的事情:
<div id="divMyusercontrols" runat="server">
<uc:myUsercontrol1 id="ctlTheControl" runat="server" />
</div>
我想做的事情,正如我所尝试的那样无效,是:
在aspx文件中:
<div id="divMyusercontrols" runat="server">
</div>
在后面的代码中,让我们说Page_Init()事件如下:
String strControl = "<uc:myUsercontrol1 id="ctlTheControl{0}" runat="server" />";
String strHtml = null;
for (int i = 0; i < 5; i++)
strHtml += String.Format(strControl, i.ToString());
this.divMyusercontrols.InnerHTML = strHtml;
这段代码遗憾地无效。我意识到我可以手动完成,但我不知道实际数量。我会提前知道的。
更新(显示答案#3正确代码):
aspx文件的C#如下。我有一个静态C#代码后面的调用,它返回计数。然后我设置一个属性来指示要显示的项目,然后是for循环。酷!
<%int iCount = MyProject.Items;%>
<%for (int iIndex = 0; iIndex < iCount; iIndex++)%>
<%{ %>
<div runat="server">
<uc:myUsercontrol1 id="ctlItem<%=iIndex %>" runat="server" />
</div>
<%}%>
解决方案(2013-02-12): 我在下面尝试了所有三个答案,遗憾的是我将其标记为一个解决方案。获胜的是Page_LoadControl()的修改版本。这是有效的代码,是的,我运行了代码。一切正常。
// Load an array of controls onto a predefined panel.
for (int iIndex = 0; iIndex < 10; iIndex++)
{
// Load the control.
MyProject.Controls.MyControl ctlItem = (MyProject.Controls.MyControl)Page.LoadControl(@"/Controls/MyControl.ascx");
// Initialize the control.
ctlItem.MyIndex = iIndex;
// Add the control to the panel.
this.pnlItems.Controls.Add(ctlItem);
}
这是固定的aspx代码。
<div id="divItems" runat="server" class="divItems">
<dx:ASPxPanel ID="pnlItems" runat="server" Width="200px">
</dx:ASPxPanel>
</div>
我尝试过,MyProject.Controls.MyControl ctlItem = new MyProject.Controls.MyControl(),但是这不起作用。我得到了一个无效的优惠。加载控件有效。
答案,我也被标记为解决方案,但不起作用。跑步时,设计师抱怨道。这是设计师的代码。
/// <summary>
/// ctlPurchases<%=iIndex %> control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::MyProject.Controls.MyControl ctlItem<%=iIndex %>;
设计师对&lt;%...%&gt;感到不满部分。该解决方案还有其他问题。最干净的是使用Page_LoadControl。
答案 0 :(得分:1)
当我想要用户控件的多个副本时,我通常会遵循以下模式
<%for (Counta = 1; Counta <= 10; Counta++) {%>
<div id="divMyusercontrols<%=Counta%>" runat="server">
<uc:myUsercontrol1 id="ctlTheControl<%=Counta%>" runat="server" />
</div>
<%}%>
上面的代码会给我10个嵌入10个div元素的UserControl
请注意我使用在线工具将代码从VB转换为c#所以我不知道它的准确性。但我不知道它在VB中对我有用。
VB代码如下进行比较
<%for Counta = 1 To 10%>
<div id="divMyusercontrols<%=Counta%>" runat="server">
<uc:myUsercontrol1 id="ctlTheControl<%=Counta%>" runat="server" />
</div>
<%Next%>
答案 1 :(得分:1)
您可以使用ASP.NET面板并使用Page.LoadControl()吗?
for (int i = 0; i < 10; i++)
{
pnlContent.Controls.Add(Page.LoadControl("ucDemo.ascx"));
}
这是在C#BTW。
或者如果这些UserControls是数据绑定的,您可以尝试使用Repeater控件。
答案 2 :(得分:0)
我认为你可以在Page_Load中执行:
HtmlGenericControl control = FindControl("divMyusercontrols")
var myControl = new MyControl();
for(int i=0; i<numberOfUserControls; i++)
{
myControl.ID = "myUniqueID" + i;
}
myControl.Controls.Add(myControl);