2011-08-11 59 views
0

動的にリストビューを作成しようとしています。 reports.aspxユーザはチェックボックスの束を選択します。次のページでは、reports.aspxが表示され、選択したチェックボックスの列を含む表が表示されます。私の考えは、リストビューを作成し、LayoutTemplateのヘッダー行を動的に変更し、選択した列に応じてselectステートメントを変更することでした。これは私が持っているものです。リストビューのヘッダーセルの数を動的に変更するLayoutTemplate

<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS"> 
<LayoutTemplate runat="server"> 
<table runat="server"> 
    <tr runat="server"> 
    <% 
    ' Doesn't work because code blocks (<%%>) aren's allowed inside <LayoutTemplate> blocks 
    'For Each i As String In Request.Form 
       'Response.Write("<th>" & Request.Form(i) & "</th>") 
    'Next 
    %> 
    </tr> 
</table> 
    <asp:PlaceHolder runat="server" ID="itemPlaceHolder" /> 
</LayoutTemplate> 
... 

問題は、私はLayoutTemplate内のコードブロック(< %%>)を置くことができないので、これは動作しないということです。 LayoutTemplateを編集する方法や、Request.Form変数を循環させてテーブルのヘッダー行を作成する方法がありますか?

アドバイス/ご指摘ありがとうございます! -Russ

答えて

0

にこのロジックを添付し、私はちょうどページ上の別のテーブルを作成したが、リストビューの外で、それはそれを行うための簡単な方法でした。そして、背後にあるコードで

<asp:Table ID="HeaderTable" runat="server"> 
     <asp:TableHeaderRow ID="HeaderTableHeaderRow" runat="server" /> 
</asp:Table> 

<asp:ListView ...> 
    ... 
</asp:ListView> 

For Each i As String In Request.Form 
     If i.IndexOf("checkbox_") = 0 Then 
      Dim c As New TableHeaderCell() 
      Dim l As New LinkButton() 
      l.Text = i.Substring(Len("checkbox_")) 
      c.Controls.Add(l) 
      c.CssClass = "customreport" 
      HeaderTableHeaderRow.Cells.Add(c) 
     End If 
    Next 

非常にシンプル。だから私はLayoutTemplateをまったく使用する必要はありませんでした。

1

レイアウトテンプレートの代わりにバインディング構文にItemTemplateを使用してみてください。レイアウトテンプレートは厳密にレイアウト用であると私は信じています。

また、従来のASPコードブロックを使用しているようです。

<%# Eval("<COLUMN NAME>")%> 

をデータバインディング関与しない他の例の場合:データバインディングの

:ASP.NETのコードブロックは次のようになり制御が既にサーバ側制御であるので

<%= Request.QueryString["Hello"] %> 
+0

この種の質問は私の質問に答えました。私はちょうどリストビューの外に行を作ることができたし、それはかなり簡単でした。ありがとう! – russds

1

を、してみてくださいとIDを与え、事前レンダリング時にヘッダーを変更する:

<asp:ListView runat="server" ID="ReportListView" DataSourceID="ReportListViewSDS"> 
<LayoutTemplate runat="server"> 
<table runat="server"> 
    <tr id='trCustomHeader" runat="server"> 

次に、あなたのc後ろの頌歌、リストビューの事前レンダリング

ReportListView_PreRender(...) 
{ 
    TableRow tr = ReportListView.FindControl("trCustomerHeader"); 
    TableCell tempCell = new TableCell(); 
    tempCell.Text = ... 
    tr.Cells.Add(tempCell); 
} 
+0

ありがとうございますが、レイアウトビューの要素をリストビューに追加するたびに、次のエラーが表示されます。 'ListView' ReportListView 'に項目プレースホルダを指定する必要があります。コントロールのIDプロパティを "itemPlaceholder"に設定して、項目のプレースホルダを指定します。アイテムのプレースホルダコントロールでは、runat = "server"も指定する必要があります。エラーが発生した行はlistview.databind()行です。これは、データがコードの背後にバインドされているため、レイアウトテンプレートの処理方法がわからないためです。私はlayouttemplateを削除するときに動作します。奇妙な。 – russds

関連する問題