Строки отображаются несколько раз в GridView

#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:

Я не знаю, на правильном ли вы пути или нет, потому что без просмотра данных трудно сказать, но на ваш вопрос о сортировке по дополнительному столбцу вы определенно можете сделать это легко:

  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:

     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();
      

Комментарии:

1. Спасибо, я рассмотрю один из этих подходов. Мне нужно будет работать таким образом, чтобы это дополнительное поле использовалось даже тогда, когда пользователь переупорядочивает сетку из пользовательского интерфейса, но я что-нибудь придумаю.