Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以编程方式创建用户控件数组_C#_Asp.net_User Controls_Web User Controls - Fatal编程技术网

C# 如何以编程方式创建用户控件数组

C# 如何以编程方式创建用户控件数组,c#,asp.net,user-controls,web-user-controls,C#,Asp.net,User Controls,Web User Controls,如何以编程方式创建web用户控件数组 我创建了一个web用户控件。我已经知道如何在aspx文件中实现其中一个代码,但是我想知道是否可以通过Page_Init()或Page_Load()事件中的代码来实现 我已经知道aspx页面上的初始化 <%@ Register TagPrefix="uc" TagName="myUsercontrol1" Src="/Controls/myUsercontrol1.ascx" %> 按照传统方式,我会做一些类似的事情: <div id=

如何以编程方式创建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;
String strControl=“”;
字符串strHtml=null;
对于(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): 我尝试了下面的三个答案,不幸的是,我将其中一个作为解决方案。获胜的是页面_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);
}
//将控件数组加载到预定义的面板上。
对于(int iIndex=0;iIndex<10;iIndex++)
{
//加载控件。
MyProject.Controls.MyControl ctlItem=(MyProject.Controls.MyControl)Page.LoadControl(@“/Controls/MyControl.ascx”);
//初始化控件。
ctlItem.MyIndex=iIndex;
//将控件添加到面板。
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 %>;
//
///控制权。
/// 
/// 
///自动生成的字段。
///将字段声明从设计器文件修改为代码隐藏文件。
/// 
受保护的全局::MyProject.Controls.MyControl ctlItem;

设计师对这个零件不满意。这个解决方案还有其他问题。最干净的是使用页面加载控件。

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

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

上面的代码将给我10个嵌套在10个div元素中的UserControls

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

下面是VB代码以供比较

<%for Counta = 1 To 10%>
<div id="divMyusercontrols<%=Counta%>" runat="server">
  <uc:myUsercontrol1 id="ctlTheControl<%=Counta%>" runat="server" />
</div>
<%Next%>

我认为您可以在页面加载中执行以下操作:

  HtmlGenericControl control = FindControl("divMyusercontrols")
  var myControl = new MyControl();
  for(int i=0; i<numberOfUserControls; i++)
  {
     myControl.ID = "myUniqueID" + i; 
  }
  myControl.Controls.Add(myControl);
HtmlGenericControl=FindControl(“divMyusercontrols”)
var myControl=new myControl();

对于(int i=0;i您可以使用ASP.NET面板并使用Page.LoadControl()吗

for(int i=0;i<10;i++)
{
pnlContent.Controls.Add(Page.LoadControl(“ucDemo.ascx”);
}
这是C#BTW


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

我在您的代码中没有看到任何数组。很好。这很有效。谢谢。我会为任何感兴趣的读者添加正确的代码。谢谢,有时转换为c/c对我来说有点困难,但很好,您理解了我的意思g、 太好了!!这会起作用,但这不会让代码随着时间的推移变得更难阅读吗?在后面的代码中处理它会更容易阅读,IMHO,而且可能会更灵活。我对事情有点太热心了。我应该先编译并运行代码。我正在使用Visual Studio 2012和.Net 4.0。如果我删除,设计师会抛出并重新创建代码有问题的行,ctlItem上的一个错误。它讨厌这个。另外,设计视图不能显示控件。除非我遗漏了什么,否则会出现问题。我将继续测试。感谢RRJOHNSO85的评论。我仍然很好奇代码是否可以工作。@RRJOHNSO85我想这取决于每个开发人员的codi个人风格ng,有些人喜欢将代码和文档放在一个文件中,而另一些人则喜欢将它们分为代码和文档。我猜每个人都有自己的。也许OP(Sarah)会使用这个示例,并根据自己的风格进行修改。她还提到“谢谢。我将为任何感兴趣的读者添加适当的代码。”我必须尝试。最后一个先出现,所以我尝试了。我还有很多东西要学。这次我没有匆忙地尝试所有三个选项。两个不起作用,但这一个起作用了。我应该添加“var d=new ucDemo()“是不必要的。Page_LoadControl()返回一种类型的控件。请参阅我编辑的问题中的解决方案。谢谢!谢谢Sarah!我也从代码段中删除了不必要的变量。”。
for (int i = 0; i < 10; i++)
{
    pnlContent.Controls.Add(Page.LoadControl("ucDemo.ascx"));
}