Поскольку вы устанавливаете DataSet
как DataSource
, а затем приводите его к DataTable
с оператором as
.
Оператор 'as' в C # является предварительным приведением - если невозможно выполнить приведение (типы не совместимы) вместо генерирования исключения, так как при непосредственном приведении оператор 'as' устанавливает ссылку на ноль.
Если у вас есть только один набор данных в наборе данных, вы можете получить первый элемент, подобный этому:
ds.Tables[0];
... или используйте имя таблицы:
ds.Tables["myTable"];
в вашем случае вы можете попробовать ...
DataTable dt = GridView1.DataSource.Tables[0] as DataTable;
Надеюсь, это поможет!
EDIT
относительно вашей проблемы с сортировкой (как только вы получите данные):
if (dt != null)
{
dt.DefaultView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
GridView1.DataBind();
}
Вы можете сделать это, потому что dt является ссылкой на точно такой же объект, который уже установлен в качестве источника данных для вашей сетки. Это должно сработать - если нет, то есть что-то еще, чего мне не хватает (например, мы сортируем неправильную таблицу, что означает, что у вас есть более одной таблицы в наборе данных).
EDIT:
посмотрел ваш код. Я не знаю точно, когда GetValues будет запущен, но я подозреваю, что это вызывает вашу проблему (я думаю, что это может переопределить вашу сортировку или SMT в этом направлении).
Если вы закомментируете FillDataSource из getValues и измените свой PageLoad для этого:
void Page_Load(Object sender, EventArgs e)
{
// Load data only once, when the page is first loaded.
if (!IsPostBack)
{
Session["myDataSet"] = FillDataSet();
}
}
затем в вашем методе сортировки вы извлекаете источник данных следующим образом:
DataTable dt = ((DataSet)Session["myDataSet"]).Tables[0];
Также вы можете получить DataSet из сеанса в вашем методе разбивки на страницы.
Вы также должны заметить улучшение производительности, поскольку вы извлекаете материал из БД только один раз.
Дайте ему шанс!