Динамически добавлять столбцы в Gridview с использованием источника данных, отличного от привязанного

Скажите, возможно ли это вообще:

У меня есть gridview, привязанный к ObjectDataSource, который предоставляет мне данные из базы данных. Я заполняю Objectdatasource, используя Linq-to-entity. Типичная установка, в которой я использую столбцы и строки.

Ниже у меня ужасное графическое изображение.


       x_col    x_col   x_col   
x_row| x_data   x_data  x_data    
x_row| x_data   x_data  x_data  
x_row| x_data   x_data  x_data  
x_row| x_data   x_data  x_data    
x_row| x_data   x_data  x_data   

Что я хотел бы сделать, так это добавить столбцы в это представление сетки из другой таблицы в базе данных: исходные данные - это x; разные данные являются y.


       x_col    x_col   x_col   y_col   y_col   y_col 
x_row| x_data   x_data  x_data  y_data  y_data  y_data
x_row| x_data   x_data  x_data  y_data  y_data  y_data
x_row| x_data   x_data  x_data  y_data  y_data  y_data
x_row| x_data   x_data  x_data  y_data  y_data  y_data  
x_row| x_data   x_data  x_data  y_data  y_data  y_data 

Я не знаю никакой информации y до времени выполнения, поэтому она добавляется динамически. Мне не нужно обновлять x обратно в базу данных, но мне нужно обновить y.

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

Надеюсь, я здесь не слишком абстрактен.


person isorfir    schedule 08.09.2010    source источник


Ответы (1)


Короткий ответ - да, вы можете динамически изменять / регенерировать столбцы GridView. Самый простой способ сделать это - программно определить DataSource перед DataBinding. DataSource может быть IEnumerable практически любого объекта, что позволяет создавать настраиваемый объект GridRow, содержащий данные в той форме, в которой вы хотите их просматривать.

Вот что я бы сделал на высоком уровне:

  • Удалите определения статических столбцов из GridView в разметке и установите для свойства AutoGenerateColumns значение true в самом GridView. Это заставит GridView создавать столбцы в DataBinding на основе объекта, используемого в качестве источника данных.

  • Создайте простой класс POCO для представления каждого набора данных, который вы хотите показать. Если количество различных расположений столбцов будет большим или не может быть известно во время компиляции, возможно, стоит потратить накладные расходы на извлечение или отправку данных в DataTable.

  • При подготовке результатов перенесите данные в список соответствующего класса POCO или в DataTable. Установите этот список или DataTable в качестве источника данных и вызовите DataBind ()

  • Пользовательские метки можно указывать программно; по умолчанию система будет использовать представление ToString () имени поля, свойства или столбца своего объекта DataSource. Вы можете переопределить это поведение, присоединив обработчик к событию OnDataBinding GridView или просто изменив имена столбцов после вызова DataBind ().

Кроме того, вы можете не создавать столбцы автоматически, но по-прежнему делать это динамически при загрузке страницы или PreRender. Это позволит вам контролировать все особенности самостоятельно, не полагаясь на настройки по умолчанию. Вы можете использовать это для создания различных динамических сеток, которые будут отображаться на поля одного и того же объекта данных, что несколько уменьшит количество ваших классов.

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

person KeithS    schedule 08.09.2010
comment
Спасибо за ответ! Вы нашли какие-нибудь примеры этого, на которые я мог бы взглянуть? - person isorfir; 08.09.2010