Кто-нибудь знает способ скрыть столбец в списке asp.net?

StackOverflow https://stackoverflow.com/questions/70758

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Вот ваш 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>

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top