2009-04-06 11 views
2

文字列ビルダでRenderControlを使用して、asp:TreeViewにドロップダウンリストを追加しています。私のドロップダウンリストは自動ポストバックに設定されており、SelectedIndexChangedイベントが添付されています。残念ながら、私は自分のツリービューの中に正しくドロップダウンリストが表示されているのを見ていますが、選択を変更してもイベントは発生しません。ここRenderControlでポストバックのイベントを登録するには?

は私のコードです:DropDownListコントロールか何かのようにRegisterEventするいかなる方法が

DropDownList ddlTest = new DropDownList(); 
ddlTest.Items.Add("test"); 
ddlTest.Items.Add("test2"); 
ddlTest.AutoPostBack = true; 
ddlTest.SelectedIndexChanged += ddlTest_SelectedIndexChanged; 

TreeNode node = new TreeNode(); 

StringBuilder sb = new StringBuilder(); 
StringWriter sw = new StringWriter(sb); 
HtmlTextWriter writer = new HtmlTextWriter(sw); 

ddlTest.RenderControl(writer); 

node.Text = sb.ToString(); 
node.ShowCheckBox = false; 

はありません。私がやろうとしていることを達成する方法はありますか?

答えて

1

レンダリング/レンダーコントロールは、通常、あらゆる種類のイベントの接続に遅れがちです。代わりにPreRenderを使用してみてください。

+1

ドロップダウンはコントロールのコレクションに追加されていません。それは単にテキストとして書かれています。 – Ruslan

+1

良い点、私はその部分を無視しました.DIはその問題に対する解決策を持っています.netバージョンによっては、Page(非推奨)やClientScriptManagerのメソッドGetPostBackEventReferenceを使って手動でポストバック呼び出しを生成することができます要素のonchangeイベント – gsnerf

1

イベントを受信できるようにするには、コントロールのコレクション内にコントロールとして存在する必要があります。また、一意のID(状況の数によって異なる)が必要な場合もあります。

今、ドロップダウンのレンダリングされたhtmlをテキストとして書き込みます。 doPostBack関数がある場合とない場合があります。それができたとしても、処理するコントロールがないため、フレームワークがそれを処理する方法はありません。

TreeNodeにControlsコレクションがないので、隠れたドロップダウンを1つ追加し、残りの方法でレンダリングし、このようにフレームワークを欺くことを試してみることができます。しかし、それは妥当性検査、可視性、IDなどに対処する必要があるので、扱いにくいです。

自分でポストバックイベントを処理することもできます。あなたが__doPostBackを適切に形成したと仮定すると、ページ上でRequest.Form ["__ EVENTTARGET"]とRequest.Form ["__ EVENTARGUMENT"]をロードしてそれに応じて処理します。

また、独自のツリービューを作成することもできます。

関連する問題