2014-10-15 2 views
0

У меня есть элемент управления GridView, который загружается на страницу и действует как гнездо для других GridView. Каждый дочерний GridView содержит те же столбцы и типы данных, и поэтому я хочу, чтобы пользователь мог щелкнуть LinkButton для сортировки каждого из этих GridViews с помощью указанного выражения сортировки. Вот код, который у меня есть до сих пор, который не работает. Он просто переходит в PostBack, но возвращает данные в том же порядке.ASP.NET Сортировка каждого Gridview в коллекции

foreach (Control c in Page.Controls) 
    { 
     if (c.ID == "dgvResults") 
     { 
      GridView s = (GridView)c; 
      DataTable dataTable = s.DataSource as DataTable; 

      if (dataTable != null) 
      { 
       DataView dataView = new DataView(dataTable); 
       dataView.Sort = "OEN ASC"; 

       s.DataSource = dataView; 
       s.DataBind(); 
      } 


     } 
    } 

Edit 1: Я обнаружил, что DataSource больше не связан с PostBack, так что я должен хранить GridView DataSource как DataTable в переменной сеанса. Теперь я не могу заставить это работать.

Редактировать 2: Я попытался сохранить Gridview.DataSource как в событиях DataBinding, так и в DataBound моего дочернего GridViews, но они никогда не сохраняются в любом случае. Когда я пытаюсь вызвать их снова в приведенном выше коде, переменная сеанса, которая должна содержать Datatable, не существует.

Вот код, который я поставил, чтобы хранить DataTable:

// The variable 's' represents the GridView control that triggered the DataBinding event 
Session["dtResults"] = s.DataSource as DataTable; 

// The code below is how I call the Session variable that I set earlier in the DataBinding event 
if (Session["dtResults"] != null) 
{ 
    DataTable dataTable = (DataTable)Session["dtResults"]; 
    ... 
} 
+0

Вы включили 'viewstate' для gridview и попытались? –

+0

ViewState уже включен, и я также попытался сохранить данные в переменной ViewState []. Мне, возможно, придется идти по пути к гнезду GridView и группировать мои данные, хранящиеся в одном элементе управления GridView. – JJT

ответ

0

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

Реальная проблема заключалась в том, что мой GridViews были прикреплены к связке DropDownList управления, которые подают значения параметров в моей DataSources на PostBack. Если бы я был ограничен только 1 GridView, то я мог бы сохранить его DataTable в ViewState, но поскольку я имею дело с гнездом динамически заполненного GridViews, это было невозможно (насколько я мог работать).

Таким образом, вместо перебора каждого GridView в гнезде, я просто установить более DropDownList один, это один, содержащий список имен полей, которые соответствуют GridViews', и пользователь может выбрать из списка, на котором поле они хотят заказать данные. Затем значение этого списка передается PostBack в хранимую процедуру DataSource, которая, в свою очередь, обрабатывает параметр внутри.

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

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