2011-09-28 38 views
5

Tôi có một điều khiển GridView trên trang web của mình, sử dụng phân trang. Tôi thấy dường như hàng trùng lặp xuất hiện, nhưng tôi biết họ không có trong dữ liệu, và họ dường như biến mất bất cứ khi nào tôi sắp xếp trên một cột khác nhau từ một mặc định tôi đang sử dụng. Tuy nhiên, chúng xuất hiện lại khi sắp xếp lại cột gốc này.Hàng hiển thị nhiều lần trong GridView

Dưới đây là một đoạn mã 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" /> 

Điều đó có thể không liên quan đến vấn đề của tôi, nhưng tôi chỉ đưa vào trường hợp này.

Bây giờ, tôi tin rằng vấn đề có thể được gây ra bởi vì có một trường hợp cụ thể trong đó cột được sắp xếp theo mặc định, sẽ được điền bằng giá trị giống nhau cho nhiều hàng. Điều đó nghe có vẻ kỳ lạ, nhưng cột là một khoảng cách gần và lưới hiển thị kết quả tìm kiếm lân cận, vì vậy có thể một số tìm kiếm sẽ trả lại nhiều kết quả với cùng khoảng cách.

Vấn đề kết quả trùng lặp chỉ xảy ra khi số hàng có khoảng cách giống nhau vượt quá số kết quả được hiển thị trên mỗi trang (trong trường hợp của tôi là 10).

Bất cứ khi nào điều này xảy ra, tôi thấy một hàng xuất hiện, ví dụ: trang thứ 2 và cũng trên trang thứ 3 (không bao giờ trên cùng một trang). Sắp xếp trên một cột khác nhau và phân trang thông qua các kết quả có vẻ để loại bỏ vấn đề.

Bây giờ, sau nhiều giao diện đầu/tường, tôi đã đưa ra giải thích đầu cơ;

Đó là hành vi được mong đợi hoàn toàn vì không có cách nào được chỉ định để sắp xếp các hàng khi các trường giống nhau. Một số cơ chế khác phải quyết định cách sắp xếp các hàng và bất kỳ cơ chế nào này gây ra vấn đề trùng lặp bất cứ khi nào phân trang thông qua kết quả.

Tôi có đi đúng hướng ở đây không? Và nếu có, làm thế nào tôi có thể giải quyết vấn đề này? Có cách nào để sắp xếp trên cột phụ ngoài người dùng được chỉ định không?

Trả lời

2

Tôi không biết bạn có đi đúng hướng hay không vì không nhìn vào dữ liệu khó, nhưng với câu hỏi liên quan đến sắp xếp theo cột phụ, bạn chắc chắn có thể thực hiện điều này một cách dễ dàng:

  1. Nếu bạn đang sử dụng một DataTable để ràng buộc dữ liệu của bạn, bạn có thể đặt bởi hai cột với một cái gì đó như thế này về sự kiện gvResults_Sorting của bạn:

    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. Hoặc bạn không nhận được rất ưa thích và sử dụng một DataView để sắp xếp datatable:

    DataTable t .... 
    t.DefaultView.Sort="SortExpressionColumn1 ASC/DESC , SortExpressionColumn2 ASC/DESC"; 
    gvResults.DataSource=t.DefaultView.ToTable(); 
    gvResults.DataSource=t.DataBind(); 
    
  3. Nếu bạn đang sử dụng đối tượng kinh doanh tùy chỉnh, dễ dàng hơn nhiều:

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

Cảm ơn, tôi sẽ xem xét vào một trong những phương pháp tiếp cận. Tôi sẽ cần phải làm việc mọi thứ theo cách mà trường thứ cấp này được sử dụng ngay cả khi người dùng đặt hàng lại lưới từ giao diện người dùng, nhưng tôi sẽ làm việc gì đó. –

Các vấn đề liên quan