.ascx マークアップを使用して asp.net ユーザーコントロールを WebControl (.cs のみ) に作り直そうとしています。
my_new_webcontrol.cs には次のものがあります。
private readonly DropDownList _source = new DropDownList();
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
_source.ID = String.Format("{0}{1}{2}", ID, IdSeparator, "Source");
Controls.Add(_source);
}
protected override void Render(HtmlTextWriter writer)
{
RenderContents(writer);
}
protected override void RenderContents(HtmlTextWriter writer)
{
_source.RenderControl(writer);
}
id="MainContent_ComboBox1$Source"
問題は、とで DropDownList を生成することname="ctl00$MainContent$ComboBox1$Source"
です。名前は期待どおりに生成されましたが、ID が間違っているため、ここでは$ではなく_にする必要があります。
どうすれば と を達成できますid="MainContent_ComboBox1_Source"
かname="ctl00$MainContent$ComboBox1$Source"
。
更新 1。
Knaģisが提案したように、DropDownList を Panel に配置しようとしました。
private readonly DropDownList _source = new DropDownList();
private readonly Panel _panel = new Panel();
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
_panel.ID = ID;
_panel.Controls.Add(_source);
Controls.Add(_panel);
}
protected override void Render(HtmlTextWriter writer)
{
RenderContents(writer);
}
protected override void RenderContents(HtmlTextWriter writer)
{
_panel.RenderControl(writer);
}
失敗。生成された HTML (ID と名前の ComboBox1 がありません):
<div id="MainContent_ComboBox1">
<select name="ctl00$MainContent$Source" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MainContent$Source\',\'\')', 0)" id="MainContent_Source"></select>
</div>
答え
Knaģisが示唆したように、サーバー コントロール クラスの宣言で INamingContainer を見逃していました
public class ComboBox: WebControl, INamingContainer