#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. Вы должны проверить в своем коде, что вы помещаете в источник данных, чтобы знать, как это использовать.