GridView становится нулевым после сортировки?

#c# #asp.net #sorting #gridview

#c# #asp.net #сортировка #gridview

Вопрос:

Я запускаю этот обработчик событий и метод для сортировки моего GridView, но он говорит, что GridView равен null:

 protected void OtherGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dtSortTable = gvMeldingen.DataSource as DataTable;
        
            DataView dvSortedView = new DataView(dtSortTable);
            dvSortedView.Sort = e.SortExpression   " "   getSortDirectionString(e.SortDirection);
            gvMeldingen.DataSource = dvSortedView;
            gvMeldingen.DataBind();
        
    }
    private string getSortDirectionString(SortDirection sortDirection)
    {
        string newSortDirection = String.Empty;
        if (sortDirection == SortDirection.Ascending)
        {
            newSortDirection = "ASC";
        }
        else
        {
            newSortDirection = "DESC";
        }
        return newSortDirection;
    }
  

Ошибка, которую я получаю: DataTable должен быть установлен перед использованием DataView.

И это выделено: dvSortedView.Sort = e.SortExpression " " getSortDirectionString(e.SortDirection)

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

1. Является ли dtSortaTable нулевым? Не могли бы вы, пожалуйста, опубликовать код в событии загрузки страницы?

2. я получаю эту ошибку: DataTable должен быть установлен перед использованием DataView. и это выделено: dvSortedView. Sort = например,SortExpression » » getSortDirectionString(например,SortDirection);

Ответ №1:

Свойство DataSource теряется во время обхода. Вот почему DataTable dtSortTable = gvMeldingen.DataSource as DataTable; равно null и DataView dvSortedView = new DataView(dtSortTable); недопустимо.

Когда вы нажимаете на гиперссылку сортировки в datagrid, вы запускаете обратную передачу от клиента к серверу. Затем ASP.NET создает страницу ответа, используя сохраненные данные, такие как ViewState и другие.

Свойство DataSource не является частью сохраняемого состояния между циклами, поэтому его значение теряется.

Решение заключается в запросе вашего источника данных, как показано ниже:

 protected void OtherGridView_Sorting(object sender, GridViewSortEventArgs e)
    {
        var SortExpression = e.SortExpression   " "   getSortDirectionString(e.SortDirection);

        gvMeldingen.DataSource = ... // Requery the Data using the new sort expression above
        gvMeldingen.DataBind();
    }
  

Другим решением является установка источника данных каждый раз в событии Page_Load (не рекомендуется)

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

1. это приводит к ошибкам при просмотре того, где вы присваиваете что-либо непосредственно типу SortExpression.

2. а как насчет источника данных gvMeldingen?

3. Что касается источника данных gvMeldingen, не могли бы вы, пожалуйста, опубликовать фрагмент кода там, где он заполняется в первый раз?

4. источник данных получает данные из базы данных, но я работаю с вкладками, и каждая вкладка должна изменять источник данных в операторе WHERE. Первая вкладка ничего не делает, поэтому оператор WHERE изменяется при нажатии на вторую вкладку.

5. Как насчет создания метода Populate (), в котором вы заполняете свой источник данных ( .DataSource = …; DataBind(); ), и вы сохраняете инструкции WHERE и ORDER BY в некоторых переменных в другом месте (продолжайте оба использовать viewstate). Затем вы вызываете это Populate() после каждого изменения вкладки или сортировки щелчком мыши.

Ответ №2:

Поскольку вы ставите DataView вокруг DataTable , метод будет работать только в первый раз (при условии, что источником данных является DataTable с самого начала). В следующий раз источником данных будет a DataView , и вы не сможете привести его к DataTable .

Используйте представление по умолчанию DataTable в качестве источника данных с самого начала, чтобы источником данных всегда был DataView . Затем вы можете получить представление из источника и получить базовую таблицу из этого:

 DataView view = gvMeldingen.DataSource as DataView;
DataTable dtSortTable = view.Table;
  

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

1. Я не уверен, сохраняется ли источник данных между циклами

2. это ошибка, которую я получаю после вашего кода: ссылка на объект не установлена для экземпляра объекта.

3. эта часть выделена: DataTable DTSORTABLE = view. Таблица;

4. @Laurent: Да, вы правы, источник данных, конечно, воссоздается при каждой обратной передаче.

5. @Tassisto: Тогда ваш источник данных не является ни DataTable , ни DataView a. Вы должны проверить в своем коде, что вы помещаете в источник данных, чтобы знать, как это использовать.