2011-09-28 3 views
5

Ho un controllo GridView sulla mia pagina Web che utilizza il paging. Sto vedendo apparentemente delle righe duplicate che appaiono, ma so che non sono nei dati, e sembrano scomparire ogni volta che ordino su una colonna diversa da quella di default che sto usando. Tuttavia, riappaiono quando si ordina di nuovo su questa colonna originale.Righe visualizzate più volte in GridView

Ecco un frammento dell'ascx;

<asp:GridView 
    ID="gvResults" 
    AllowPaging="True" 
    CssClass="DataTable" 
    runat="server" 
    AutoGenerateColumns="False" 
    OnRowDataBound="gvResults_RowDataBound" 
    AllowSorting="True" 
    Width="750px" 
    OnSorting="gvResults_Sorting" 
    PagerSettings-Mode="NumericFirstLast" 
    PagerSettings-FirstPageText="<<" 
    PagerSettings-LastPageText=">>" 
    PagerSettings-PageButtonCount="5" 
    PagerSettings-Position="Bottom" 
    PagerStyle-CssClass="paginationContainer" 
    PagerStyle-HorizontalAlign="Left" 
    OnPageIndexChanging="gvResults_PageIndexChanging"> 

<PagerSettings 
    FirstPageText="&lt;&lt;" 
    LastPageText="&gt;&gt;" 
    Mode="NumericFirstLast" 
    PageButtonCount="5" /> 

<PagerStyle CssClass="paginationContainer" HorizontalAlign="Left" /> 

Questo potrebbe essere irrilevante per il mio problema, ma lo includo per ogni evenienza.

Ora, credo che il problema potrebbe essere causato dal fatto che esiste uno scenario particolare in cui la colonna su cui la griglia è ordinata per impostazione predefinita, verrà popolata con un valore identico per molte righe. Potrebbe sembrare strano, ma la colonna è una prossimità e la griglia visualizza i risultati della ricerca di prossimità, quindi è possibile che alcune ricerche restituiscano molti risultati con la stessa vicinanza.

Il problema dei risultati duplicati si verifica solo quando il numero di righe con una prossimità identica supera il numero di risultati visualizzati per pagina (nel mio caso 10).

Ogni volta che succede, vedo apparire una riga, ad es. la seconda pagina e anche la terza pagina (mai sulla stessa pagina). Ordinare su una colonna diversa e sfogliare i risultati sembra sradicare il problema.

Ora, dopo molte interfacce testa/muro, sono arrivato a una spiegazione speculativa;

Che questo è un comportamento totalmente previsto perché non esiste un modo specifico per ordinare le righe quando i campi sono identici. Qualche altro meccanismo deve decidere come ordinare le righe e qualunque sia il meccanismo causa il problema di duplicare ogni volta che sfoglia i risultati.

Sono sulla pista giusta qui? E se sì, come posso risolvere questo problema? C'è un modo per ordinare su una colonna secondaria oltre a quella specificata dall'utente?

risposta

2

Non so se sei sulla strada giusta o no perché guardando i dati è difficile da dire, ma alla tua domanda riguardo l'ordinamento da una colonna secondaria, puoi sicuramente farlo facilmente:

  1. Se si utilizza un DataTable collegare i dati, è possibile ordinare da due colonne con qualcosa di simile sul tuo evento gvResults_Sorting:

    Expression<Func<DataRow,object>> expCol1 = row => row["SortExpressionFirstColumn"]; 
    Expression<Func<DataRow,object>> expCol2 = row => row["SortExpressionSecondColumn"]; 
    
    OrderedEnumerableRowCollection<DataRow> result = yourTabale.AsEnumerable().OrderBy(expCol1.Compile()).ThenBy(expCol2.Compile()); 
    
    DataTable sortedTable = new DataTable(); 
    foreach (var item in result) 
    { 
         sortedTable.ImportRow(item); 
    } 
    gvResults.DataSource=sortedTable; 
    gvResults.DataBind(); 
    
  2. O non si ottiene così fantasia e l'uso un DataView per ordinare il datatable:

    DataTable t .... 
    t.DefaultView.Sort="SortExpressionColumn1 ASC/DESC , SortExpressionColumn2 ASC/DESC"; 
    gvResults.DataSource=t.DefaultView.ToTable(); 
    gvResults.DataSource=t.DataBind(); 
    
  3. Se si utilizza gli oggetti di business su misura, molto più facile:

    List<CutomObject> co = .... 
    
    co=co.OrderBy(x => x.FirstProperty).ThenBy(x => x.SecondProperty); 
    gvResults.DataSource=co; 
    gvResults.DataBind(); 
    
+0

Grazie, mi prendo uno sguardo in uno di questi approcci. Avrò bisogno di lavorare le cose in modo tale che questo campo secondario venga usato anche quando l'utente riordina la griglia dall'interfaccia utente, ma lavorerò su qualcosa. –