Фильтрация DataGridView для каждого столбца с фильтрами, видимыми над столбцами - PullRequest
3 голосов
/ 26 августа 2009

У меня довольно специфический запрос -

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

Например: -

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

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 26 августа 2009

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

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

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

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

0 голосов
/ 27 августа 2009

Я нашел очень полезный проект, который позволяет интуитивно понятную фильтрацию по столбцам - http://www.codeproject.com/KB/grid/DataGridViewFilterPopup.aspx, который удовлетворяет моим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...