2011-09-28 65 views
5

我的網頁上有一個使用分頁的GridView控件。我看到顯然有重複的行出現,但我知道它們不在數據中,並且每當我從我使用的默認列中排序時,它們似乎都會消失。但是,它們在再次對這個原始列進行排序時重新出現。在GridView中出現多次的行

這是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" /> 

這可能與我的問題無關,但我將其納入以防萬一。

現在,我認爲這個問題可能是由於有一種特定的情況,其中網格默認排序的列將被填充許多行的相同值。這可能聽起來很奇怪,但是這個列是一個鄰近區域,並且網格正在顯示鄰近搜索結果,所以有可能某些搜索將返回具有相同鄰近度的許多結果。

重複結果的問題只發生在具有相同接近度的行數超過每頁顯示結果數的情況下(在本例中爲10)。

每當發生這種情況時,我會看到一行出現,例如第二頁,也在第三頁(但從不在同一頁上)。對不同的列進行排序並對結果進行分頁似乎可以消除這個問題。

現在,經過很多頭部/牆壁接口之後,我已經到了一個推測性的解釋;

這是完全預期的行爲,因爲在字段相同時沒有指定行的排序方式。其他一些機制必須決定如何對行進行排序,無論這種機制是什麼,只要對結果進行分頁,都會導致重複問題。

我在正確的軌道上嗎?如果是這樣,我該如何解決這個問題?除了用戶指定的輔助列之外,還有什麼方法可以對輔助列進行排序?

回答

2

我不知道你是否在正確的軌道上,因爲沒有看到難以分辨的數據,但是對於由輔助列進行排序的問題,您絕對可以輕鬆完成:

  1. 如果您正在使用一個DataTable綁定你的數據,你可以在你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. 或者你沒有得到那麼花哨和使用一個DataView來排序數據表:

    DataTable t .... 
    t.DefaultView.Sort="SortExpressionColumn1 ASC/DESC , SortExpressionColumn2 ASC/DESC"; 
    gvResults.DataSource=t.DefaultView.ToTable(); 
    gvResults.DataSource=t.DataBind(); 
    
  3. 如果您正在使用自定義業務對象,更容易:

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

謝謝,我會看看到這些方法之一。即使用戶從UI重新排序網格,我也需要以這種方式來處理這些輔助字段,但我會解決這個問題。 –