コントロールを非表示にするために ItemTemplate に <% if %> ステートメントを配置できることはわかっていますが、列はまだそこにあります。列見出しが宣言されている LayoutTemplate に <% %> ステートメントを入れることはできないため、問題が発生します。誰かがより良い方法を知っていますか?
7 に答える
あなたがやりたいことを理解していることを確認して、私が行った別の解決策を次に示します。
ここにあなたのASCX / ASPXがあります
<asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder" OnDataBound="ListView1_DataBound">
<LayoutTemplate>
<table border="1">
<tr>
<td>Name</td>
<td>Age</td>
<td runat="server" id="tdIsSuperCool">IsSuperCool</td>
</tr>
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("Name") %></td>
<td><%# Eval("Age") %></td>
<td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>true</td>
</tr>
</ItemTemplate>
</asp:ListView>
<asp:ObjectDataSource
ID="MyDataSource"
runat="server"
DataObjectTypeName="BusinessLogicLayer.Thing"
SelectMethod="SelectThings"
TypeName="BusinessLogicLayer.MyObjectDataSource" />
これがコードビハインドです
/// <summary>
/// Handles the DataBound event of the ListView1 control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void ListView1_DataBound(object sender, EventArgs e)
{
ListView1.FindControl("tdIsSuperCool").Visible = false;
}
データバインドで必要なことは何でもしてください。列は現在サーバーで実行されており、コントロールの DataBound を処理しているため、ListView1.FindControl("tdIsSuperCool") を実行すると、レイアウト テンプレートにいるため、チャンピオンのように機能します。
td の可視性を制御したいビジネス ロジックを配置すれば、問題ありません。
パネルを使ってみてください、そしてあなたはそれをオン/オフにすることができます
foreach (ListViewItem item in ListView1.Items)
{
((Panel)item.FindControl("myPanel")).Visible= False;
}
ListViewを使用すると、データをクライアントにレンダリングする方法を完全に制御できます。レイアウトテンプレートを指定し、各アイテムが挿入される場所となるプレースホルダーを指定します。
以下の出力はテーブルを提供し、各アイテムは新しいTRになります。
runat='server'との使用に注意してくださいvisible ='<%# %>'
<asp:ListView ID="ListView1" runat="server" DataSourceID="MyDataSource" ItemPlaceholderID="itemPlaceHolder">
<LayoutTemplate>
<table>
<asp:PlaceHolder ID="itemPlaceHolder" runat="server" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td runat="server" id="myCol" visible='<%# (bool)Eval("IsSuperCool") %>'>
<%# Eval("SuperCoolIcon") %>
</td>
<td>
<%# Eval("Name") %>
</td>
<td>
<%# Eval("Age") %>
</td>
</tr>
</ItemTemplate>
</asp:ListView>
私はそれが非常に古い質問であることを知っていますが、実際にこれを行う必要があり、jquery と css を使用してそれを行うかなり良い方法を見つけたと思います。
ヘッダーに次を追加します。
<script type="text/javascript" src="Scripts/jquery-1.7.1.min.js" ></script>
<style>
.hide {
display:none;
}
.show {
display:block;
}
</style>
非表示にするすべての列について、カスタム プロパティを td/th に追加します。
<th runat="server" data-prop='authcheck' id="tdcommentsHeader" >Comments</th>
カスタム プロパティを使用することをお勧めします。簡単に言えば、一石二鳥の鳥を殺すことができるからです。id プロパティに基づいている場合のように、各列の値を変更する必要さえありません。
次に、列を非表示にするかどうかを知らせる非表示フィールドがあることを確認します。これは、フォーム上にある限り、asp:HiddenField またはその他にすることができます。
<asp:HiddenField runat="server" ID="IsAuthorized" Value="false" />
最後に、ページの下部で次の操作を行います。
<script type="text/javascript">
$(document).ready(function () {
var isauth = $("[id='IsAuthorized']").val();
if (isauth==="false") {
$("[data-prop='authcheck']").addClass('hide');
//$("[id*='tdcomments']").addClass('hide');
}
});
</script>
レイアウト テンプレートの列ヘッダー テキストにアクセスするために、テンプレートでラベルを作成し、リストビューのプリレンダーで findcontrol を実行し、列を「オフ」にする必要がある場合はラベルを空白のテキストにしました。これはあなたの意図ではうまくいかないかもしれませんが、私はまだ列のスペースを使用したかったのですが、空白に見えるだけです.
リストビューを後方に曲げようとすればするほど、代わりにグリッドを使用したくなるでしょう。
リストビューは、単にリストであることを意図しているため、「列」の概念は実際にはありません。
データバインディングを使用して、「何か」のリストを ListView に添付していると仮定します。その場合は、アイテムのリストだけがあり、LayoutTemplate の html がそれらのアイテムの表示方法を決定します。次に、列と行のテーブル スタイルの配列を作成することについて話している場合は、特定の列をプログラムでより詳細に制御できるため、DataGrid の方が適している可能性があります。
テーブル レイアウトを完全に CSS で作成したいと考えているかもしれませんが、それが純粋にレイアウト目的である場合、これは立派な決定です。ただし、特定の列を非表示にするという要件は、ニーズに合わせてテーブルを配置する方が適切であることを示しています。表形式のデータにテーブルを使用しても問題ありません...私見...
本当に ListView を使用する必要がある場合は、要素を表示するかどうかを決定するデータ内の何かに対してバインドを試みることができます。
style='display: <%#Eval("DisplayStyle") %>;'
このコードを、制御する html 要素内 (LayoutTemplate 内) に配置します。次に、バインド先のオブジェクトで、「ブロック」または「なし」に設定されたプロパティ「DisplayStyle」が必要になります。
より良い方法が見つからない場合は、いつでも列幅を 0 (ゼロ) に設定できます。