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

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

Ответ 1

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

Здесь ваш 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;
}

Сделайте все, что захотите, в привязке данных. Поскольку столбец теперь является сервером runat, и вы обрабатываете DataBound элемента управления, когда вы выполняете ListView1.FindControl( "tdIsSuperCool" ), вы находитесь в шаблоне макета, чтобы он работал как чемпион.

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

Ответ 2

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

 foreach (ListViewItem item in ListView1.Items)
 {
     ((Panel)item.FindControl("myPanel")).Visible= False;
 }

Ответ 3

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>

Ответ 4

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

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

Ответ 7

Я знаю, что это очень старый вопрос, но я действительно должен это сделать и думаю, что нашел довольно хороший способ сделать это через 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>