Кто-нибудь знает способ скрыть столбец в просмотре списка asp.net? - PullRequest
12 голосов
/ 16 сентября 2008

Я знаю, что вы можете поместить операторы <% if%> в ItemTemplate, чтобы скрыть элементы управления, но столбец все еще там. Нельзя помещать операторы <%%> в шаблон LayoutTemplate, в котором объявляются заголовки столбцов, поэтому возникает проблема. Кто-нибудь знает лучший способ?

Ответы [ 7 ]

19 голосов
/ 16 сентября 2008

Вот еще одно решение, которое я только что сделал, видя, что я понимаю, что вы хотите сделать:

Вот ваш 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"), вы находитесь в шаблоне Layout, так что он работает как чемпион.

Поместите любую бизнес-логику, которую вы хотите контролировать видимость тд, и вы в порядке.

3 голосов
/ 23 сентября 2008

Попробуйте использовать панель, и вы можете включить / выключить ее

 foreach (ListViewItem item in ListView1.Items)
 {
     ((Panel)item.FindControl("myPanel")).Visible= False;
 }
1 голос
/ 14 декабря 2016

Я знаю, что это очень старый вопрос, но мне действительно нужно это сделать, и я думаю, что нашел довольно хороший способ сделать это с помощью jquery и css.

Добавить в шапку следующее:

<script type="text/javascript" src="Scripts/jquery-1.7.1.min.js" ></script>
  <style>
    .hide {
      display:none;
    }
    .show {
      display:block;
    }
  </style>

Для всех столбцов, которые вы хотите скрыть, добавьте пользовательское свойство к тд / т.

<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>
1 голос
/ 16 сентября 2008

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>
0 голосов
/ 25 марта 2011

Чтобы получить доступ к тексту заголовка столбца шаблона макета, я сделал для него метки в шаблоне и произвел findcontrol в предварительном просмотре списка, а затем сделал метки пустым текстом, если столбец должен быть «выключен». Это может не сработать для ваших намерений, но я все же хотел, чтобы использовалось пространство столбца, просто выведите его пустым.

Чем дальше вы пытаетесь изогнуть представление списка назад, тем больше вы хотите, чтобы вы использовали вместо него сетку.

0 голосов
/ 16 сентября 2008

На самом деле у списка нет понятия «столбец», поскольку он предназначен для того, чтобы быть просто списком.

Я собираюсь предположить, что вы используете привязку данных, чтобы прикрепить список «чего-то» к ListView. Если это так, то у вас будет просто список элементов, и HTML-код в LayoutTemplate будет определять, как именно эти элементы будут отображаться. Если вы затем говорите о создании массива столбцов и строк в виде таблицы, то, возможно, лучшим выбором будет DataGrid, поскольку это дает гораздо более программный контроль над конкретными столбцами.

Возможно, вы надеетесь создать макет таблицы полностью с помощью CSS, что является замечательным решением , если , это исключительно для целей макета. Однако ваше требование специально скрыть один столбец указывает на то, что таблица лучше подходит для ваших нужд. Можно использовать таблицы для табличных данных ... ИМХО ...

Если вам действительно нужно использовать ListView, то вы всегда можете попробовать связать что-то в ваших данных, которое определяет, должен ли элемент отображаться или нет, например ::

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

Поместите этот код в элемент HTML, которым вы хотите управлять (в шаблоне LayoutTemplate). Тогда в объекте, к которому вы привязываете, вам потребуется свойство 'DisplayStyle', для которого было установлено значение 'block' или 'none'.

0 голосов
/ 16 сентября 2008

Вы всегда можете установить ширину столбца в 0 (ноль), если не найдете лучшего способа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...