在GridView中多次显示的行
本文关键字:显示 GridView | 更新日期: 2023-09-27 18:10:03
我在我的网页上有一个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="<<"
LastPageText=">>"
Mode="NumericFirstLast"
PageButtonCount="5" />
<PagerStyle CssClass="paginationContainer" HorizontalAlign="Left" />
这可能与我的问题无关,但我把它包括进来只是以防万一。
现在,我认为这个问题可能是因为有一个特定的场景,在这个场景中,默认情况下对网格进行排序的列将使用许多行相同的值填充。这可能听起来很奇怪,但是列是一个接近度,网格显示接近度搜索结果,所以有些搜索可能会返回许多具有相同接近度的结果。
只有当具有相同接近度的行数超过每页显示的结果数(在我的示例中为10)时,才会出现重复结果的问题。
每当发生这种情况时,我看到一行出现在,例如第2页,也在第3页上(但从不在同一页上)。在不同的列上排序并对结果分页似乎可以消除这个问题。
现在,经过许多头/墙接口,我已经得到了一个推测性的解释;
这是完全预期的行为,因为当字段相同时,没有指定的方式来排序行。必须有其他机制决定如何对行进行排序,无论这种机制是什么,在对结果进行分页时都会导致重复问题。
我讲对了吗?如果是这样,我该如何解决这个问题?除了用户指定的列之外,是否有某种方法可以对辅助列进行排序?
我不知道您是否在正确的轨道上,因为w/o查看数据很难判断,但对于您关于按副列排序的问题,您绝对可以轻松地做到这一点:
-
如果你正在使用一个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();
-
或者你不用那么花哨,使用DataView对数据表进行排序:
DataTable t .... t.DefaultView.Sort="SortExpressionColumn1 ASC/DESC , SortExpressionColumn2 ASC/DESC"; gvResults.DataSource=t.DefaultView.ToTable(); gvResults.DataSource=t.DataBind();
-
如果您正在使用自定义业务对象,则更容易:
List<CutomObject> co = .... co=co.OrderBy(x => x.FirstProperty).ThenBy(x => x.SecondProperty); gvResults.DataSource=co; gvResults.DataBind();