12

コントロールを非表示にするために ItemTemplate に <% if %> ステートメントを配置できることはわかっていますが、列はまだそこにあります。列見出しが宣言されている LayoutTemplate に <% %> ステートメントを入れることはできないため、問題が発生します。誰かがより良い方法を知っていますか?

4

7 に答える 7

20

あなたがやりたいことを理解していることを確認して、私が行った別の解決策を次に示します。

ここにあなたの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 の可視性を制御したいビジネス ロジックを配置すれば、問題ありません。

于 2008-09-16T19:56:15.747 に答える
3

パネルを使ってみてください、そしてあなたはそれをオン/オフにすることができます

 foreach (ListViewItem item in ListView1.Items)
 {
     ((Panel)item.FindControl("myPanel")).Visible= False;
 }
于 2008-09-23T02:09:34.197 に答える
1

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>
于 2008-09-16T11:08:03.660 に答える
1

私はそれが非常に古い質問であることを知っていますが、実際にこれを行う必要があり、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>
于 2016-12-14T20:51:51.333 に答える
0

レイアウト テンプレートの列ヘッダー テキストにアクセスするために、テンプレートでラベルを作成し、リストビューのプリレンダーで findcontrol を実行し、列を「オフ」にする必要がある場合はラベルを空白のテキストにしました。これはあなたの意図ではうまくいかないかもしれませんが、私はまだ列のスペースを使用したかったのですが、空白に見えるだけです.

リストビューを後方に曲げようとすればするほど、代わりにグリッドを使用したくなるでしょう。

于 2011-03-24T21:21:12.670 に答える
0

リストビューは、単にリストであることを意図しているため、「列」の概念は実際にはありません。

データバインディングを使用して、「何か」のリストを ListView に添付していると仮定します。その場合は、アイテムのリストだけがあり、LayoutTemplate の html がそれらのアイテムの表示方法を決定します。次に、列と行のテーブル スタイルの配列を作成することについて話している場合は、特定の列をプログラムでより詳細に制御できるため、DataGrid の方が適している可能性があります。

テーブル レイアウトを完全に CSS で作成したいと考えているかもしれませんが、それが純粋にレイアウト目的である場合、これは立派な決定です。ただし、特定の列を非表示にするという要件は、ニーズに合わせてテーブルを配置する方が適切であることを示しています。表形式のデータにテーブルを使用しても問題ありません...私見...

本当に ListView を使用する必要がある場合は、要素を表示するかどうかを決定するデータ内の何かに対してバインドを試みることができます。

style='display: <%#Eval("DisplayStyle") %>;'

このコードを、制御する html 要素内 (LayoutTemplate 内) に配置します。次に、バインド先のオブジェクトで、「ブロック」または「なし」に設定されたプロパティ「DisplayStyle」が必要になります。

于 2008-09-16T10:25:36.337 に答える
0

より良い方法が見つからない場合は、いつでも列幅を 0 (ゼロ) に設定できます。

于 2008-09-16T10:15:17.780 に答える