Salve a tutti!
Vorrei non visualizzare dei valori trovati in una tabella attraverso l'esecuzione di una Query molto complessa in un DB.
Posso agire a livello di DataBinding durante la costruzione della ListView?

Grazie in anticipo al primo che mi aiuterà!
GDP
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Gianluca,
non ho ben capito se i valori da non visualizzare sono delle colonne o delle righe.

Se sono delle colonne è semplice: ti basta modificare i campi restituiti dalla query SELECT oppure, se preferisci non toccarla, andrai a mostrare solo quelli che ti interessano nell'ItemTemplate del ListView.

Se invece si tratta di righe, dovresti escluderle agendo sulla clausola WHERE della query oppure farlo a posteriori nel momento stesso in cui la riga viene bindata alla ListView. In quest'ultimo caso dovresti gestire l'evento ItemDataBound e decidere, in base ai valori della riga, se deve apparire o meno.

Oppure, se ottieni il risultato da un metodo del business layer a cui non hai accesso, allora potresti anche filtrare o trasformare la lista usando LINQ to Objects.

Spiega bene in che situazione ti trovi.

ciao,
Moreno

Enjoy learning and just keep making
ciao,
grazie per l'aiuto. In effetti devo intervenire a livello di databinding, la Query non mi consente di applicare filtri perchè come ti ho detto è molto molto complessa e potivi oscuri si blocca se tento di filtrare i dati. Quindi vorrei agire durante il databining. Hai qualche suggerimento?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Gianluca,
scusa ma non mi è ancora chiaro se vuoi escludere righe o colonne. Penso che tu voglia escludere righe, dato che hai scritto:

la Query non mi consente di applicare filtri


Quindi puoi fare così: come descritto nel post precedente, sottoscrivi l'evento ItemDataBound della ListView, che verrà sollevato ogni volta che una delle righe è stata associata all'ItemTemplate.
<asp:ListView ID="lista" OnItemDataBound="lista_ItemDataBound" runat="server">
    <ItemTemplate>
        <!-- Qui tuoi controlli -->
    </ItemTemplate>
</asp:ListView>

Nel codefile, crea il metodo lista_ItemDataBound (ma sei libero di dargli un nome che preferisci) ed esamina i dati della riga corrente. Se i dati non sono conformi al tuo criterio, rendi invisibile il template di questa riga impostando la proprietà Visible a false.
protected void lista_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    if (e.Item.ItemType == ListViewItemType.DataItem)
    {
        //Questo cambia in base al tipo del tuo DataItem
        //Non so di che tipo sia... forse una DataRowView?
        //Metti un breakpoint per capire di che tipo è e.Item.DataItem
        var riga = e.Item.DataItem as DataRowView;
        if (riga["NomeCampo"] == "ValoreIndesiderato") {
            //Se uno dei campi ha un valore indesiderato, nascondo la riga
            e.Item.Visible = false;
        }
    }
}

In questo modo il ListView non mostrerà le righe che hai reso invisibili.

Ci sono ovviamente altri sistemi, tipo assegnare il risultato della query ad una variabile e filtrare le righe prima di metterle in binding con il ListView.
La cosa che ti consiglio, comunque, è quella di risolvere il problema a monte, cioè operare a livello di query e risolvere i "motivi oscuri" che ti impediscono di filtrare i risultati.

ciao,
Moreno
Modificato da BrightSoul il 29 luglio 2015 22.12 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.