Alguém sabe de uma maneira de esconder uma coluna em uma asp.net listview?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu sei que você pode colocar <% if %> instruções no ItemTemplate para ocultar os controles, mas a coluna ainda está lá.Você não pode colocar <% %> instruções para o LayoutTemplate que é que os cabeçalhos de coluna são declaradas, portanto, o problema.Alguém sabe de uma maneira melhor?

Foi útil?

Solução

Aqui está outra solução que eu fiz, vendo que eu entendo o que você deseja fazer:

Aqui está a sua 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" />

Aqui está o código por trás

/// <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;
}

Faça o que você deseja na caixa de ligação de dados.Porque a coluna é agora runat servidor, e você está lidando com a ligação de dados do controle, quando você fizer ListView1.FindControl("tdIsSuperCool") você está no modelo de Layout, de modo que funciona como um campeão.

Colocar qualquer lógica de negócio que você deseja controlar a visibilidade do td, e você é bom.

Outras dicas

Tente Usar um Painel e você pode ligar / Desligar

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

O ListView dá-lhe total controlo sobre a forma como os dados são apresentados para o cliente.Especificar o Layout de Modelo, e dar um espaço reservado que vai ser onde cada item é injetado.

A saída a seguir lhe dará uma mesa, e cada item será um novo TR.

Observe o uso de runat='server' e 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>

Eu sei que é muito velha questão, mas na verdade, estou tendo de fazer isso e acho que eu encontrei um bastante agradável maneira de fazê-lo através de jquery e css.

Adicione o seguinte cabeçalho:

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

Para todas as colunas que você deseja ocultar, adicionar uma propriedade personalizada para o td/th.

<th runat="server" data-prop='authcheck'  id="tdcommentsHeader"  >Comments</th>

Eu estou aconselhando a utilização de uma propriedade personalizada porque, longa história curta, pode matar um bando de pássaros com uma pedra.Você não precisa mesmo de mudar o valor para cada coluna, como seria se nós baseia-se na identificação de propriedade.

Próximo, verifique se você tem um campo oculto que diz, você pode saber se é ou não para ocultar a coluna.Este pode ser um asp:HiddenField ou qualquer outro desde que está no formulário.

<asp:HiddenField runat="server" ID="IsAuthorized" Value="false" />

Finalmente, na parte inferior da página, faça:

        <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>

Você sempre pode definir a largura da coluna como 0 (zero) se você não encontrar uma maneira melhor.

O listview não tem um conceito de 'coluna', pois destina-se apenas para ser, também, uma lista.

Eu vou assumir que você está usando ligação de dados para anexar uma lista de 'coisas' para o ListView.Se for esse o caso, então você só vai ter uma lista de itens e o html no LayoutTemplate vai decidir apenas sobre como os itens são exibidos.Se você, em seguida, falando sobre a criação de uma tabela de estilo de matriz de linhas e colunas, em seguida, talvez um DataGrid seria uma escolha melhor, pois isto dá muito mais controle programático de colunas específicas.

Pode ser que você está esperando para criar a tabela de layout inteiramente através de CSS, que é um admirável decisão se é puramente para fins de layout.No entanto, sua exigência especificamente para ocultar uma coluna indica-me que uma tabela está melhor posicionada para atender às suas necessidades.É bom usar tabelas para dados tabulares...IMHO...

Se você realmente precisa usar um ListView, então você pode sempre tentar vinculação contra algo em seus dados que determina se um elemento deve ser mostrada ou não, por exemplo:

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

Coloque este código dentro do elemento html que você deseja controlar (no LayoutTemplate).Em seguida, no objeto são vinculativas para você precisaria de uma propriedade 'Theta', que foi definido para 'bloquear' ou 'nenhum'.

Para acessar o modelo de layout de cabeçalho de coluna de texto, fui etiquetas no modelo, e não um findcontrol em prerender do listview e, em seguida, fez os rótulos de texto em branco se a coluna deve ser "desligado".Isto pode não funcionar para suas intenções, mas para mim, eu ainda queria que o espaço de coluna para ser usado, apenas aparecem em branco.

Quanto mais longe você vai tentar fazer um listview dobre-se para trás, mais você vai querer que você usou uma grade em vez disso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top