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