2009-08-26 8 views
3

У меня довольно специфический запрос -Фильтрация DataGridView для каждого столбца с фильтрами, видимые выше столбцов

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

Например: -

 | Foo | Bar     | Baz | 
     ------------------------------------| 
Filters | > 10 | 1/1/1980 - 1/1/2009 | Boo | 
     | 12 | 1/3/1995   | Boo | 
     | 99 | 5/12/2005   | Boo | 
        etc. 

Метод, который я думал, что будет наилучшим образом решить эту проблему должен был иметь два DataTables, один из которых выступает в качестве DataSource для DataGridView (так что я могу иметь вид автоматическую генерацию столбцов и не нужно писать целую кучу шаблона, чтобы сами вставлять строки), который сам состоит из одной строки для хранения фильтров и данных базы данных под ним, а второй - для хранения данных базы данных, которые могут быть программно добавлены к первому.

Проблема с этим решением состоит в том, что столбцы ограничены типом столбца, например здесь Foo является целым числом, Bar является DateTime, а Baz - строкой. При попытке ввода текста фильтра в Foo или Bar DataGridView выдает сообщение об ошибке, указывающее, что ячейка не может содержать текст.

Возможно ли иметь строку, содержащую типы, полностью отделенные от типов столбцов остальной части таблицы?

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

Решения, которые невозможны - с использованием WPF, используя сторонний DataGridView (если, возможно, OSS DGV с коммерческой лицензией на использование).

В настоящее время представляется лучшим решением может быть импортирование всех данных в базу данных, которая может использоваться как строки (данные ниже фильтров доступны только для чтения). Однако это кажется довольно поразительно хакерским.

Я пропустил что-то простое и очевидное здесь? Я рад, что оказался ошибочным, если это даст мне дорогу вперед! :-)

ответ

1

Я сделал это в прошлом, и это был действительно настоящий забавный проект. Идея в основном заключается в наследовании от базового класса DataGridViewColumnHeaderCell и делает вашу собственную картину. Мне потребовалось бы много времени, чтобы объяснить все, что у вас есть, но есть действительно отличная статья от Microsoft, которая заставила меня начать. Я не делал этого точно, как они это сделали, но это привело меня к правильному пути.

http://msdn.microsoft.com/en-us/library/aa480727.aspx

Кроме того, что вы должны принять во внимание, что DataTable имеет свойство DataView на нем, который имеет тип DataView. На нем есть свойство RowFilter, которое можно использовать для фильтрации строк. Нет необходимости в двух таблицах данных вообще. Вот хорошая статья о том, как использовать свойство RowFilter:

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

+0

Я знаю, что для фильтрации с использованием представлений данных мне было поручено, что мы должны выполнять фильтры как предложения where в строке SQL, а не извлекать все данные, а затем фильтровать с видом, следовательно, два типа данных. Кроме того, у меня действительно нет времени писать пользовательский обработчик, как это предлагается в этой статье; на самом деле я использовал этот образец кода для фильтрации в datagridviews, однако это само по себе ничего не обеспечивает рядом с требуемой функциональностью, мне пришлось бы написать много кода для его адаптации. – ljs

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