Asp.net Gridview - Почему изменения DataRowBound теряются при сортировке? - PullRequest
2 голосов
/ 09 февраля 2011

Я делаю изменения условного форматирования данных в моем виде сетки, используя событие RowDataBound:

    void gvReg_RowDataBound(object sender, GridViewRowEventArgs e)
    {

       if (e.Row.RowType == DataControlRowType.DataRow)
       {

          DateTime lastUpdate DateTime.Parse(DataBinder.Eval   (e.Row.DataItem, "LAST_UPDATE");

          if (lastUpdate < DateTime.Today.AddMonths(-1))
          {

             Hyperlink hypLastUpdate = (Hyperlink)e.Row.FindControl("hypLastUpdate";
             hypLastUpdate.CssClass = "Error";
             hypLastUpdate.NavigateUrl = "http://www.someExampleErrorPage.com";

          }

       }

    }

Это работает и устанавливает правильный класс CssClass для гиперссылки (что делает его ярким оттенком жирного красного цвета), но после сортировки вида сетки (посредством нажатия пользователем заголовка столбца) класс css сбрасывается в hypLastUpdate и теряет свой стиль и связанное свойство NavigateUrl.

Элемент управления hypLastUpdate содержится в поле шаблона в виде сетки, и его текстовое значение привязано к полю с именем "LAST_UPDATE".

Это запланированное поведение (предполагается, что сортировка нарушает условное форматирование, выполняемое в событиях RowDataBound?) Или есть что-то, что я могу проверить, чтобы убедиться, что я что-то делаю неправильно?

Я не использую метод DataBind где-либо в коде, и viewstate включено для рассматриваемого вида сетки.

- EDIT -

Это оказалось ошибкой в ​​обработке событий.

Я делал:

gvReg.Sorted += {SomeEventHandler}

Внутри события загрузки страницы, но только когда это не было обратной передачей. Эта функция называется gvReg.DataBind после сортировки сетки. Я удалил проводник обработчика и вместо этого добавил функцию обработчика события в событие OnSorted. Я полагаю, что назначенные делегаты в gridview не сохраняются в ViewState между обратными вызовами?

1 Ответ

4 голосов
/ 09 февраля 2011

Привет, вот быстрый пример того, что я имел в виду в своем комментарии. Это единственный способ, которым я мог думать об этом:

    protected void gvReg_Sorting(object sender, GridViewSortEventArgs e)
    {
        GridView gridView = (GridView)sender;

        if (e.SortExpression.Length > 0)
        {
            foreach (DataControlField field in gridView.Columns)
            {
                if (field.SortExpression == e.SortExpression)
                {
                    cellIndex = gridView.Columns.IndexOf(field);
                    break;
                }
            }

            if (pSortExpression != e.SortExpression)
            {
                pSortDirection = SortDirection.Ascending;
            }
            else
            {
                pSortDirection = (pSortDirection == SortDirection.Ascending ? SortDirection.Descending : SortDirection.Ascending);
            }
            pSortExpression = e.SortExpression;
        }

        //Retrieve the table from the database 
        pSortOrder = pSortDirection == SortDirection.Ascending ? "ASC" : "DESC";
        List<Partners> partnerList = GetPartnerList();

        gvReg.DataSource = partnerList;
        gvReg.DataBind();

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...