2011-09-28 15 views
5

que tienen un control GridView en mi página web que hace uso de paginación. Aparentemente aparecen filas duplicadas, pero sé que no están en los datos, y parecen desaparecer cada vez que selecciono una columna diferente de la que estoy usando. Sin embargo, reaparecen al ordenar nuevamente esta columna original.filas que muestran múltiples veces en GridView

He aquí un fragmento de la 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" /> 

Eso podría ser irrelevante para mi problema, pero lo incluyo por si acaso.

Ahora, creo que el problema posiblemente se deba a que existe un escenario particular en el que la columna en la que se ordena la cuadrícula de forma predeterminada se rellenará con un valor idéntico para muchas filas. Puede sonar extraño, pero la columna es una proximidad y la cuadrícula muestra resultados de búsqueda de proximidad, por lo que es posible que algunas búsquedas devuelvan muchos resultados con la misma proximidad.

La emisión de los resultados duplicados sólo ocurre una vez el número de filas con una proximidad idéntica excede el número de resultados mostrados por página (en mi caso, 10).

Cada vez que esto ocurre, veo una fila aparecen en, por ejemplo, la segunda página, y también en la tercera página (nunca en la misma página, sin embargo). Ordenar en una columna diferente y buscar los resultados parece erradicar el problema.

Ahora, después de mucho interconexión cabeza/de la pared, que han llegado a una explicación especulativa;

Que este es un comportamiento totalmente esperado porque no hay una forma especificada de ordenar las filas cuando los campos son idénticos. Algún otro mecanismo debe decidir cómo ordenar las filas, y cualquiera que sea el mecanismo que causa el problema duplicado cada vez que busca los resultados.

Estoy en el camino correcto aquí? Y si es así, ¿cómo puedo abordar este problema? ¿Hay alguna forma de ordenar en una columna secundaria además del especificado por el usuario?

Respuesta

2

No sé si usted está en el camino correcto o no, porque w/o mirando a los datos es difícil de decir, pero a su pregunta acerca de la clasificación por una columna secundaria, que sin duda puede hacer esto fácilmente:

  1. Si está utilizando un DataTable para unirse a sus datos, puede ordenar por dos columnas con algo como esto en su caso 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 usted no consigue tan de fantasía y el uso un DataView para ordenar la tabla de datos:

    DataTable t .... 
    t.DefaultView.Sort="SortExpressionColumn1 ASC/DESC , SortExpressionColumn2 ASC/DESC"; 
    gvResults.DataSource=t.DefaultView.ToTable(); 
    gvResults.DataSource=t.DataBind(); 
    
  3. Si está utilizando objetos de negocio a medida, mucho más fácil:

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

Gracias, voy a echar un vistazo a uno de estos enfoques. Tendré que trabajar las cosas de tal manera que este campo secundario se use incluso cuando el usuario reordena la cuadrícula desde la interfaz de usuario, pero voy a resolver algo. –

Cuestiones relacionadas