1

如何以编程方式创建一组 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 %>;

设计师对 <%...%> 部分不满意。该解决方案还有其他问题。最干净的是使用 Page_LoadControl。

4

3 回答 3

1

当我想要我的用户控件的多个副本时,我通常遵循以下模式

<%for (Counta = 1; Counta <= 10; Counta++) {%>
<div id="divMyusercontrols<%=Counta%>" runat="server">
  <uc:myUsercontrol1 id="ctlTheControl<%=Counta%>" runat="server" />
</div>
<%}%>

上面的代码会给我 10 个嵌套在 10 个 div 元素中的用户控件

更新

请注意,我使用了一个在线工具将代码从 VB 转换为 c#,所以我不知道它有多准确。但是我不知道它在 VB 中对我有用。

下面是VB代码进行比较

<%for Counta = 1 To 10%>
<div id="divMyusercontrols<%=Counta%>" runat="server">
  <uc:myUsercontrol1 id="ctlTheControl<%=Counta%>" runat="server" />
</div>
<%Next%>
于 2013-02-12T00:21:20.187 回答
1

您可以使用 ASP.NET 面板并使用 Page.LoadControl() 吗?

for (int i = 0; i < 10; i++)
{
    pnlContent.Controls.Add(Page.LoadControl("ucDemo.ascx"));
}

这是在 C# BTW 中。

或者,如果这些 UserControl 将是数据绑定的,您可以尝试使用 Repeater 控件。

于 2013-02-12T00:36:56.597 回答
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);
于 2013-02-12T00:27:30.083 回答