¿Alguien conoce alguna forma de ocultar una columna en una vista de lista de asp.net?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Sé que puedes poner declaraciones <% if %> en ItemTemplate para ocultar los controles, pero la columna sigue ahí.No puede colocar declaraciones <% %> en LayoutTemplate, que es donde se declaran los encabezados de las columnas, de ahí el problema.¿Alguien sabe de una manera mejor?

¿Fue útil?

Solución

Aquí hay otra solución que acabo de hacer, ya que entiendo lo que quieres hacer:

Aquí está tu 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" />

Aquí está el código detrá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;
}

Haz lo que quieras en el databound.Debido a que la columna ahora se ejecuta en el servidor y usted está manejando el DataBound del control, cuando hace ListView1.FindControl("tdIsSuperCool") está en la plantilla de Diseño, por lo que funciona como un campeón.

Coloque cualquier lógica de negocios que desee para controlar la visibilidad del td y estará bien.

Otros consejos

Intente usar un panel y podrá activarlo o desactivarlo

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

ListView le brinda control total sobre cómo se representan los datos al cliente.Usted especifica la plantilla de diseño y proporciona un marcador de posición que será donde se inyecta cada elemento.

El resultado de lo siguiente le dará una tabla y cada elemento será un nuevo TR.

Observe el uso de runat='server' y 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>

Sé que es una pregunta muy antigua, pero en realidad tengo que hacer esto y creo que encontré una manera bastante buena de hacerlo a través de jquery y css.

Agregue lo siguiente al encabezado:

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

Para todas las columnas que desee ocultar, agregue una propiedad personalizada al td/th.

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

Recomiendo utilizar una propiedad personalizada porque, en pocas palabras, puede matar un montón de pájaros de un tiro.Ni siquiera necesitarás cambiar el valor de cada columna, como lo harías si basáramos esto en la propiedad id.

A continuación, asegúrese de tener un campo oculto que le indique si desea ocultar o no la columna.Puede ser un asp:HiddenField o cualquier otro, siempre que esté en el formulario.

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

Finalmente, en la parte inferior de la página, haga:

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

Siempre puedes establecer el ancho de la columna en 0 (cero) si no encuentras una mejor manera.

La vista de lista realmente no tiene un concepto de "columna", ya que está destinada a ser, bueno, una lista.

Voy a suponer que está utilizando el enlace de datos para adjuntar una lista de "algo" al ListView.Si ese es el caso, entonces solo tendrá una lista de elementos y el html en LayoutTemplate decidirá cómo se muestran esos elementos.Si luego está hablando de crear una matriz de columnas y filas estilo tabla, entonces tal vez un DataGrid sería una mejor opción, ya que esto brinda mucho más control programático de columnas específicas.

Es posible que desee crear el diseño de la tabla completamente a través de CSS, lo cual es una decisión admirable. si es puramente para fines de diseño.Sin embargo, su requisito de ocultar específicamente una columna me indica que es mejor colocar una tabla para satisfacer sus necesidades.Está bien usar tablas para datos tabulares...En mi humilde opinión...

Si realmente necesita usar un ListView, siempre puede intentar vincularlo a algo en sus datos que determine si un elemento debe mostrarse o no, por ejemplo:

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

Coloque este código dentro del elemento html que desea controlar (en LayoutTemplate).Luego, en el objeto al que se está vinculando, necesitaría una propiedad 'DisplayStyle' que estuviera configurada en 'bloqueo' o 'ninguno'.

Para acceder al texto del encabezado de la columna de la plantilla de diseño, les hice etiquetas en la plantilla e hice un control de búsqueda en la representación previa de la vista de lista, luego puse las etiquetas en texto en blanco si la columna debía estar "desactivada".Es posible que esto no funcione para sus intenciones, pero en mi caso todavía quería que se usara el espacio de la columna, solo que aparezca en blanco.

Cuanto más intentes hacer que una vista de lista se doble hacia atrás, más desearás haber usado una cuadrícula en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top