0

.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
4

1 に答える 1

1

ID の子パネル (または別のコンテナー コントロール) をComboBox1追加し、その中にDropDownListIDの を追加する必要がありますSource。ASP.NET に階層識別子を生成させます。

ClientIDつまり、作り直したコントロールの値と値を保持したい場合は、マークアップNameとまったく同じコントロール ツリーを使用する必要があります.ascx

于 2013-05-10T11:35:48.797 に答える