#c# #asp.net #gridview
#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="amp;<amp;<"
LastPageText="amp;>amp;>"
Mode="NumericFirstLast"
PageButtonCount="5" />
<PagerStyle CssClass="paginationContainer" HorizontalAlign="Left" />
Это может не иметь отношения к моей проблеме, но я включаю это на всякий случай.
Теперь я считаю, что проблема, возможно, вызвана тем, что существует определенный сценарий, в котором столбец, по которому сетка сортируется по умолчанию, будет заполнен одинаковым значением для многих строк. Это может показаться странным, но столбец — это близость, а сетка отображает результаты поиска по близости, поэтому возможно, что некоторые поиски вернут много результатов с одинаковой близостью.
Проблема с повторяющимися результатами возникает только тогда, когда количество строк с одинаковой близостью превышает количество результатов, отображаемых на странице (в моем случае 10).
Всякий раз, когда это происходит, я вижу, что строка появляется, например, на 2-й странице, а также на 3-й странице (однако никогда на одной странице). Сортировка по другому столбцу и просмотр результатов, похоже, устраняет проблему.
Теперь, после долгих взаимодействий head / wall, я пришел к умозрительному объяснению;
Что это полностью ожидаемое поведение, потому что не существует определенного способа сортировки строк, когда поля идентичны. Должно быть, какой-то другой механизм решает, как сортировать строки, и независимо от того, что этот механизм вызывает повторяющуюся проблему при просмотре результатов.
Я на правильном пути? И если да, то как я могу решить эту проблему? Есть ли какой-нибудь способ сортировки по дополнительному столбцу в дополнение к указанному пользователем?
Ответ №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();
-
Или вы не так увлекаетесь и используете DataView для сортировки datatable:
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();
Комментарии:
1. Спасибо, я рассмотрю один из этих подходов. Мне нужно будет работать таким образом, чтобы это дополнительное поле использовалось даже тогда, когда пользователь переупорядочивает сетку из пользовательского интерфейса, но я что-нибудь придумаю.