2011-08-12 5 views
1

を表示していない動的なコントロールを生成:C#が、私は私のページのいずれかで、次のC#のコードを持っている

protected override void Render(HtmlTextWriter writer) 
    { 
     //an array named fieldNames is delcared here 

     writer.Write("<form id=\"Form1\" runat=\"server\" action=\"\">"); 
     writer.Write("<asp:checkboxlist id=\"checkBoxes\" runat=\"server\">"); 
     for (int count = 0; count < fieldNames.GetLength(0); count++) 
     { //iterates over the array of field names 
      writer.Write("<asp:listitem text=" + fieldNames[count] + " value=" + fieldNames[count] + "/>"); 
     } 
     writer.Write("</asp:checkboxlist>"); 
     writer.Write("</form>"); 
    } 

意図は動的に設定の属性を持っていたチェックボックスのリストを作成することです。

これを実行してもエラーは発生しませんが、コントロールはページに表示されません。

私は、次のHTMLを取得し、ページのソースを表示する場合:私は別のアプリケーションでこの投稿を

<form id="Form1" runat="server" action=""> 
    <asp:checkboxlist id="checkBoxes" runat="server"> 
     <asp:listitem text='Spares Part No' value='Spares Part No'/> 
     <asp:listitem text='Description' value='Description'/> 
     <asp:listitem text='Site' value='Site'/> 
     <asp:listitem text='Rack/Bin Number' value='Rack/Bin Number'/> 
    </asp:checkboxlist> 
</form> 

関心のうちに、すべてのコントロールが表示されているとそれがうまく動作します。

これはイベントの呼び出し順序に問題がありますか?私は次に何をしようとするかについて少し迷っているので、アドバイスはすばらしくなるだろう。

おかげで、

オリバー

答えて

1

これは基本的にはできません。

レンダリングイベントは、ページのライフサイクルの非常に遅れて発生します。 ASPXマークアップを出力することはできません。これは、マークアップを解析し、コントロールをインスタンス化するなどのイベントが既に実行されているためです。

あなたが行う必要があるのは、マークアップ内のページにPlaceHolderコントロールを追加し、以前のイベント(InitやLoadなど)で、そのプレースホルダに必要なコントロールを追加することです。あなたが望むものを達成できる一つの方法は、マークアップを生成するためにVirtualPathProviderを使用することです

var checkbox = new CheckboxList { Id = "checkBoxes" }; 
uxPlaceHolder.Controls.Add(checkbox); 
checkbox.Items.Add(new ListItem { Text = "...", Value = "..." }); 

:ここでもあなただけのラインに沿って、しかし、ASPXマークアップを書き出す、あなたがコントロールをインスタンス化する必要がありますすることはできません.aspx要求がフレームワークによって要求されているためあるいは、実際に生成したいHTML出力(つまり、いくつかの関連するjavascriptで入力要素のリスト)を見て、これらを直接レンダリングすることもできます。これらの両方はおそらく厄介なハックとして分類されるべきです。

+0

十分です - この種のスクリプトを先に呼び出す方法はありますか? page_loadイベントの使用について考えましたが、イベントの呼び出し順序がわからないことがあります。 –

+0

ページのライフサイクル中に宣言的なASPXマークアップを追加することはできません。どうして? 'ページ'は.Netオブジェクトなので、宣言マークアップとコードの後ろにコードを組み合わせることでコンパイルされます。コードビハインドが実行されるまでにマークアップが解析され、Pageオブジェクトが作成されました。それ以降は、コントロールツリー(マークアップの解析によって作成されたインスタンス化されたオブジェクト)を操作する必要があります。これは良いことです - テキストマークアップをまとめるよりも、エラーが発生しにくく、簡単です。 –

+0

これに感謝します - プレースホルダーのアイデアは私にはよく見えます。あなたの助けに感謝:) –

0

あなたは、サーバー側のコードレンダリングしている - ブラウザが理解していません。

ページをレンダリングする前に、CheckBoxListとそのListItemをフォームに追加する必要があります。

サーバー側のコントロールは、ブラウザのHTMLをレンダリングします。通常、サーバー側のマークアップを解析するAsp.Netによって作成されます。

0

あなたはブラウザに直接HTMLコンテンツを書いているので、htmlタグだけを使うべきです。

関連する問題