行在GridView中显示多次

时间:2011-09-28 20:31:50

标签: c# asp.net 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页,也是第3页(但从不在同一页面上)。对不同的列进行排序并对结果进行分页似乎可以消除这个问题。

现在,经过多次头/墙接口后,我得出了一个推测性的解释;

这是完全预期的行为,因为当字段相同时没有指定的方法对行进行排序。其他一些机制必须决定如何对行进行排序,无论这种机制是什么,都会在分析结果时导致重复问题。

我在这里走在正确的轨道上吗?如果是这样,我该如何解决这个问题?除了用户指定的列之外,还有某种方法可以对辅助列进行排序吗?

1 个答案:

答案 0 :(得分: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();