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を使用することです。