2008-09-16 16 views

Respuesta

18

Aquí hay otra solución que acabo de hacer, viendo 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 de

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

Haga lo que quiera en el databound. Como la columna ahora es runat server, y está manejando el DataBound del control, cuando hace ListView1.FindControl ("tdIsSuperCool") está en la plantilla de diseño para que funcione como un campeón.

Ponga la lógica de negocio que desee para controlar la visibilidad de la td y está bien.

+0

Gracias, estaba buscando en todas partes para esto. – Bert

+0

Exactamente lo que necesitaba también ... ¡Gracias! –

+0

Para ocultar el TD dentro de la lista, tuve que iterar a través de ListView.Items luego 'HtmlControl tdColumn = listView.Items [i] .FindControl (" tdColumn ") como HtmlControl;' -> 'if (tdColumn! = Null) {tdColumn.Visible = false; } 'Esto se hizo después de que los artículos fueran datos enlazados. –

0

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

+0

no puedo conseguir una columna para reducir el tamaño por debajo del tamaño del encabezamiento. Solo estoy agregando width = "0" - ¿hay algo más que deba hacer? Además, ¿funcionaría esto al establecer cualquier celda en la columna al ancho 0 o tiene que ser todas ellas? –

0

La lista de la lista realmente no tiene un concepto de 'columna', ya que está destinado a ser, bueno, una lista.

Voy a suponer que está utilizando 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á exactamente cómo se muestran esos elementos. Si está hablando de crear una matriz de filas y columnas estilo tabla, tal vez una opción DataGrid sea una mejor opción, ya que proporciona un control mucho más programático de las columnas específicas.

Es posible que desee crear el diseño de la tabla por completo a través de CSS, que es una decisión admirable si es exclusivamente para fines de diseño. Sin embargo, su requisito de ocultar específicamente una columna me indica que una tabla está mejor ubicada para satisfacer sus necesidades. Está bien usar tablas para datos tabulares ... EN MI ...

Si realmente necesita usar un ListView, entonces siempre puede intentar vincular algo en sus datos que determina si un elemento se debe mostrar o no, por ejemplo:

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

colocar este código en el elemento hTML que desea controlar (en el LayoutTemplate). Luego, en el objeto al que se está vinculando, necesitaría una propiedad 'DisplayStyle' que estaba configurada como 'block' o 'none'.

+0

El problema es que no puede agregar bloques de código dentro de LayoutTemplate, por lo que no puedo ver cómo elimina la fila de encabezado. –

1

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

La salida de abajo le dará una tabla, y cada artículo será un nuevo TR.

Aviso el uso de runat = 'servidor' 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> 
+2

Tengo una fila de encabezado en LayoutTemplate y no puede agregar bloques de código dentro de LayoutTemplate. ¿Hay alguna otra forma de especificar los encabezados de columna? –

3

trate de usar un panel y se puede activar/Off

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

encontré que poner un panel en las tablas para mostrar y ocultar columnas rompe el XHTML colocando div entre las etiquetas tr/td. Tal vez no sea un problema para ti, pero hace que nuestros desarrolladores de HTML se impacienten. –

+0

Utilicé la respuesta aceptada para las celdas de encabezado th pero las celdas de contenido td provocaron que la página fallara (temida página en blanco) si les agregué 'runat =' server '' . Creo que es porque contienen DropDownLists y Buttons, etc. Las celdas simples estaban bien. Utilicé la solución de panel de Fred para ocultar las celdas de la tabla. – Resource

0

Para acceder al texto de la plantilla de diseño encabezado de la columna, los hice etiquetas de la plantilla, y no un FindControl en el prerender de la vista de lista , luego convirtió las etiquetas en texto en blanco si la columna debe estar "desactivada". Puede que esto no funcione para tus intenciones, pero para mí aún quería que se utilizara el espacio de columnas, simplemente aparece en blanco.

Mientras más se esfuerce por hacer que una vista de lista se incline hacia atrás, más deseará utilizar una cuadrícula.

+0

¿tiene algún código que pueda proporcionar? – toxicate20

0

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

Añadir lo siguiente a la cabecera:

<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 desea ocultar, agregar una propiedad personalizada para el TD/th.

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

estoy aconsejando a utilizar una propiedad personalizada porque, cuento largo, que puede matar a un montón de pájaros de un tiro. Ni siquiera necesitará cambiar el valor de cada columna, como lo haría si basamos esto en la propiedad de id.

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

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

Por último, en la parte inferior de la página, hacer:

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