Строки, появляющиеся несколько раз в GridView - PullRequest
5 голосов
/ 29 сентября 2011

На моей веб-странице есть элемент управления 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 Ответ

2 голосов
/ 29 сентября 2011

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

  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();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...