2016-05-04 4 views
0

У меня возникают некоторые данные ручной сортировки вручную в gridview. Я использовал набор данных и установил AllowSort равным true, а также написал код для обработки сортировки на основе руководства, указанного на https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.sorting.aspx. Однако, когда я запускаю свой код, данные отображаются, но когда я нажимаю заголовок каждого столбца, ничего не происходит. вот мой кодВручную сортировка данных в Gridview в asp.Net Webforms

protected void Page_Load(object sender, EventArgs e) 
    { 


     string connstring = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString; 
     SqlConnection conn = new SqlConnection(connstring); 
     conn.Open(); 
     SqlCommand comm = conn.CreateCommand(); 


    comm.CommandText = "SELECT Count(Student.StudentID) AS StdCount, Schools.Name, Schools.StartDate, School.SchoolFees FROM Schools INNER JOIN Students ON Schools.SchoolID = Student.SchoolID WHERE School.Active = 1 GROUP BY Schools.Name, Schools.StartDate, Schools.SchoolFess ORDER BY Schools.Name ASC"; 
     SqlDataAdapter da = new SqlDataAdapter(comm); 

     DataSet ds = new DataSet(); 

     da.Fill(ds); 

     if (ds.Tables.Count > 0) 
     { 
      DataTable dt = ds.Tables[0]; 

      ViewState["datable"] = dt; 
     } 



     GridView1.DataSource = ds; 
     GridView1.DataBind(); 

    } 
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
    { 

     //Retrieve the table from the session object. 
     DataTable dt = (DataTable)ViewState["datable"]; 

     if (dt != null) 
     { 

      //Sort the data. 
      dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); 
      GridView1.DataSource = ViewState["datable"]; 
      GridView1.DataBind(); 
     } 

    } 

    private string GetSortDirection(string column) 
    { 

     // By default, set the sort direction to ascending. 
     string sortDirection = "ASC"; 

     // Retrieve the last column that was sorted. 
     string sortExpression = ViewState["SortExpression"] as string; 

     if (sortExpression != null) 
     { 
      // Check if the same column is being sorted. 
      // Otherwise, the default value can be returned. 
      if (sortExpression == column) 
      { 
       string lastDirection = ViewState["SortDirection"] as string; 
       if ((lastDirection != null) && (lastDirection == "ASC")) 
       { 
        sortDirection = "DESC"; 
       } 
      } 
     } 

     // Save new values in ViewState. 
     ViewState["SortDirection"] = sortDirection; 
     ViewState["SortExpression"] = column; 

     return sortDirection; 
    } 

Любая помощь будет оценена. Спасибо

+0

Вы отлаживали, чтобы узнать, какое значение возвращает ваша функция? Создайте переменную 'string sortOrder = GetSortDirection (e.SortExpression);' и поставьте точку останова –

+0

Пожалуйста, не храните такие объекты, как таблицы данных в ViewState. ViewState не предназначен для использования в качестве механизма кэширования для тяжелых материалов. Сделайте еще один запрос к базе данных или кеширование на стороне сервера, но не просмотрите состояние. – Andrei

+0

Кроме того, вы повторно привязываете GridView с данными на каждой странице_load.Нет необходимости делать это, оберните этот код в 'if (! Page.IsPostback)' – Andrei

ответ

0

Вам необходимо привязать DefaultView DataTable, который является этой упорядоченной, а не переменной ViewState.

protected void GridView1_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    //Retrieve the table from the session object. 
    DataTable dt = (DataTable)ViewState["datable"]; 
    if (dt != null) 
    { 
     //Sort the data. 
     dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression); 
     GridView1.DataSource = dt.DefaultView; 
     GridView1.DataBind(); 
    } 
} 
+0

Спасибо @Rocoso. Я изменил код, как вы сказали выше, но он все еще не работает. Когда я нажимаю, ничего не происходит, как если бы событие не срабатывало. Я добавил точку останова в блоке кода GridView1_Sorting, и точка останова никогда не будет достигнута. – elfico

+0

Можете ли вы вставить код aspx? – Rocoso

+0

Я только что узнал, что для параметра EnableSortingAndPagingCallbacks установлено значение «true», поэтому событие не запускается. Я установил его в false и событие срабатывает. Но вид происходит только один раз. когда я нажимаю снова, страница просто перезагружается, и она не сортируется. Спасибо за вашу помощь. – elfico

0

Это выглядит как вопрос Page LifeCycle.

Каждый раз, когда вы размещаете назад вся страница LifeCycle работает

В вашем случае вы извлекаете и перезапись ViewState["datable"] на каждом постбэка, при условии, конечно, что if (ds.Tables.Count > 0) оценивается как истина.

И тогда вы делаете это в загрузке страницы:

GridView1.DataSource = ds; 

но в вашей сортировочной рутина доступ:

DataTable dt = (DataTable)ViewState["datable"]; 
... 
GridView1.DataSource = ViewState["datable"]; 

Вы только что заменили GridView.DataSource, который первоначально был DataSet, с DataTable

Оберните ваши первоначальные поиска данных в PageLoad как это

if(!Page.IsPostback) 
{ 
    // This retrieves Data once, and you persist it 
    // in the ViewState no need to Keep retrieving it 
    // unless the data has changed 
} 

// Rebind outside the if 
GridView1.DataSource = (DataTable) ViewState["datable"]; 
GridView1.DataBind(); 

Добавление

За Андреем он правильно. ViewState - это скрытое поле вашего визуализированного ASPX. Просмотр исходного кода страницы в браузере и поиск

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="" /> 

Это Хорошо использовать в качестве учебного пособия, пока набор данных невелик и не содержит какой-либо конфиденциальной информации.

Но поскольку он передается на вашу страницу и с вашей страницы на каждом обратном отправлении, вы несете много накладных расходов. Представьте, если ваш DataSet содержал несколько тысяч строк.

Состояние сеанса - лучший вариант, но кэш приложений лучше. Элементы управления данными сервера, такие как SqlDataSource, используют этот кеш, и вы тоже можете. Получите доступ к нему точно так же, как ViewState:

ViewState["datable"] = dt; 

Cache["datable"] = dt; 

Но не сойди с ума. ViewState, SessionState, Cookies, LocalStorage и т. Д. Все имеют свое место, изучают их.

+0

Спасибо @fnostro. Я последовал совету Андрея и использовал сеанс для хранения данных. Подпрограмма сортировки работает сейчас, но она просто сортируется в порядке убывания, и когда я нажимаю снова, страница перезагружается и не сортирует ее в порядке возрастания. – elfico

+0

Я отлаживал и выяснял, что я ошибся в вызове функции сортировки дважды, и именно по этой причине сортировка не работала хорошо. Спасибо за помощь @fnostro. – elfico

Смежные вопросы