1

Webユーザーコントロールの配列をプログラムで作成するにはどうすればよいですか?

Webユーザーコントロールを作成しました。それらのコーディングの1つを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):悲しいことに、1つを解決策としてマークした後、以下の3つの回答すべてを試しました。勝者は、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()を試してみましたが、機能しません。私はnullの免除を受けました。コントロールのロードが機能しました。

私も急いで解決策としてマークした答えは機能しません。実行されたとき、デザイナーは不平を言いました。これがデザイナーからのコードです。

    /// <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

ASP.NET パネルを使用して Page.LoadControl() を使用できますか?

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

これはC#ところでです。

または、これらの UserControls がデータ バインドされる場合は、Repeater コントロールを使用してみてください。

于 2013-02-12T00:36:56.597 に答える
1

ユーザーコントロールの複数のコピーが必要な場合、通常は次のパターンに従います

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

上記のコードは、10 個の div 要素内にネストされた 10 個の 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%>
于 2013-02-12T00:21:20.187 に答える
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 に答える