Qualcuno conosce un modo per nascondere una colonna in una listview asp.net?

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

  •  09-06-2019
  •  | 
  •  

Domanda

So che puoi inserire le istruzioni <% if %> nell'ItemTemplate per nascondere i controlli ma la colonna è ancora lì.Non è possibile inserire le istruzioni <% %> nel LayoutTemplate che è dove vengono dichiarate le intestazioni delle colonne, da qui il problema.Qualcuno conosce un modo migliore?

È stato utile?

Soluzione

Ecco un'altra soluzione che ho appena fatto, visto che ho capito cosa vuoi fare:

Ecco il tuo 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" />

Ecco il codice dietro

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

Fai quello che vuoi nel databound.Poiché la colonna ora viene eseguita sul server e stai gestendo il DataBound del controllo, quando esegui ListView1.FindControl("tdIsSuperCool") sei nel modello Layout, quindi funziona come un campione.

Metti qualunque logica di business tu voglia controllare la visibilità del td e sei a posto.

Altri suggerimenti

Prova a utilizzare un pannello e puoi attivarlo/disattivarlo

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

ListView ti dà il pieno controllo sul modo in cui i dati vengono visualizzati al client.Si specifica il modello di layout e si fornisce un segnaposto che sarà il punto in cui verrà inserito ogni elemento.

L'output di seguito ti darà una tabella e ogni elemento sarà un nuovo TR.

Notare l'uso di 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>

So che è una domanda molto vecchia, ma in realtà devo farlo e penso di aver trovato un modo abbastanza carino per farlo tramite jquery e css.

Aggiungi quanto segue all'intestazione:

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

Per tutte le colonne che desideri nascondere, aggiungi una proprietà personalizzata a td/th.

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

Sto consigliando di utilizzare una proprietà personalizzata perché, per farla breve, può prendere un sacco di piccioni con una fava.Non avrai nemmeno bisogno di modificare il valore per ogni colonna, come faresti se lo basassimo sulla proprietà id.

Successivamente, assicurati di avere un campo nascosto che ti indichi se nascondere o meno la colonna.Può essere un asp:HiddenField o qualsiasi altro purché sia ​​presente nel modulo.

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

Infine, in fondo alla pagina, esegui:

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

Puoi sempre impostare la larghezza della colonna su 0 (zero) se non trovi un modo migliore.

La listview non ha realmente il concetto di "colonna" poiché è intesa solo per essere, beh, una lista.

Presumo che tu stia utilizzando l'associazione dati per allegare un elenco di "qualcosa" a ListView.Se questo è il caso, avrai solo un elenco di elementi e l'HTML nel LayoutTemplate deciderà come verranno visualizzati tali elementi.Se stai quindi parlando di creare un array di colonne e righe in stile tabella, forse un DataGrid sarebbe una scelta migliore poiché offre un controllo molto maggiore a livello di codice su colonne specifiche.

Può darsi che speri di creare il layout della tabella interamente tramite CSS, il che è una decisione ammirevole Se è puramente per scopi di layout.Tuttavia, la tua esigenza di nascondere specificamente una colonna mi indica che una tabella è nella posizione migliore per soddisfare le tue esigenze.Va bene usare le tabelle per i dati tabulari...IMHO...

Se hai davvero bisogno di utilizzare un ListView, puoi sempre provare ad associare qualcosa nei tuoi dati che determina se un elemento deve essere mostrato o meno, ad esempio:

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

Inserisci questo codice all'interno dell'elemento html che vuoi controllare (nel LayoutTemplate).Quindi nell'oggetto a cui ti stai collegando avrai bisogno di una proprietà "DisplayStyle" che sia impostata su "blocca" o "nessuno".

Per accedere al testo dell'intestazione della colonna del modello di layout, ho creato delle etichette nel modello e ho eseguito un findcontrol nel prerender della visualizzazione elenco, quindi ho reso le etichette testo vuoto se la colonna doveva essere "disattivata".Questo potrebbe non funzionare per le tue intenzioni, ma per me volevo comunque che lo spazio della colonna fosse utilizzato, apparisse semplicemente vuoto.

Più provi a fare in modo che una visualizzazione elenco si pieghi all'indietro, più desidererai di utilizzare invece una griglia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top