|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Народ! Не подскажите как произвести поиск в DataGridView по содержимому в ячейке, без применения циклов. Т.е. найти строку, в заданном столбце, содержащую введенную фразу. GridView заполняется на основании DataSource. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2007, 21:23 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Юзай BindingSource ! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2007, 23:42 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Тоесть Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.04.2007, 23:45 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Спасибо. А как по найденной в BindingSource строке определить строку в DataGridView? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2007, 15:55 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Большое спасибо. Все получилос. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2007, 15:59 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
И еще один вопрос. Как сделать в BindingSource поиск по неполному значению поля? Т.е. что-от на пример: DataTable dt = new DataTable(); .... .... DataRow[] dr = dt.Select(Colum_name + " LIKE '" + value + "*'"); int row_index = dt.Rows.IndexOf(dr[0]); но только не используя DataTable, а сразу в BindingSource. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2007, 16:21 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Вот так. Через CurrencyManager. Сначала делаеш текстбокс а в нем Событие TextChanged Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2007, 14:41 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Спасибо. До этого я додумался. А как вот сделать это же, но без использования DataTable и DataRow. Хотелось бы чтоб это все выполнялось в BindingSource. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2007, 19:16 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
В принципе эту операцию можно сделать еще проще Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.04.2007, 19:41 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Простите за некропостинг, но хотел выяснить один вопрос, а плодить одинаковые темы не к чему. В дот НЕТе недавно, до этого 5 лет был в делфях. Начал работать с БД (АДО дот НЕТ), модель конечно отличается от делфефской, но тем не менее, жить можно)) Такой вопрос (непосредственно связанный с поиском): как я понял, поиск можно сделать используя: 1) DataView - но только по ключу сортировки, что меня не устраивает, мне нужно запись при текущем положении строк; 2) DataTable - метод Select. Возвращает набор найденных строк, но он не может позиционировать строку в гриде. 3) BindingSource - метод Find и свойство Position делают всё как мне нужно, при этом используется результат выполнения п.2. Это пока, что смог найти и узнать о поиске данных в дот НЕТ. Если у кого есть ещё варианты, буду рад выслушать. Теперь пример того, как я делаю: - раз, поиск и позиционирование только ч/з биндинг, то его и нужно ставить в датаСорс грида Код: plaintext 1.
- реализация поиска: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
это правильное решение или же есть более грамотные построения? _______________ "Если человек не знает, куда он плывет, для него нет благоприятных ветров". Сенека ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 11:47 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Не понял? Вам нужно найти одну запись или их может быть и более одной? Если одну - то я пользуюсь методом BindingSource.Find. А если несколько - то на что Вы хотите поставить курсор? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 12:19 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
vagner забывший парольНе понял? Вам нужно найти одну запись или их может быть и более одной? Если одну - то я пользуюсь методом BindingSource.Find. А если несколько - то на что Вы хотите поставить курсор? да, для поиска одной записи, по коду выше, также использован метод Find. но результат может возвращать более одной строки, следовательно, нужно реализовать метод FindNext . Эту проблему я также обошел, создал класс поиска, он сохраняет результат поиска DataRow[] , а затем, при вызове метода FindNext , увеличиваем наш индекс (в коде выше, было указано 0, т.е. первую берем запись). во время реализации метода FindNext возник такой вопрос: метод Select возвращает набор упорядоченных строк (например, при буквенном поле, в алфавитном порядке). А как ему сказать не делать этого и оставить это как есть гриде? у Select 'а есть вариант подать на вход пар-р Sort , следовательно, нужно выяснить какая сейчас сортировка в гриде и передать. DataGridView.SortedColumn и DataGridView.SortOrder содержат всю необходимую информацию. НО, только в том случае, когда пользователь кликнет по столбцу для сортировки, если же ничего не трогалось, то ошибка - DataGridView.SortedColumn не определен. А что делать, если в начальном запросе уже была объявлена сортировка в области order by, как это передать гриду, только явно? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 12:38 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Селектом DataTable не пользовался и удивлен тем, что он сортирует результат если сортировка не задана явно. А по какому столбцу и что - иначе, чем они отсортированы в гриде? Если честно, то я так и не понял сути проблемы. С одной записью все ясно. А откуда берется несколько? Вы реализуете некий фильтр? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 12:48 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Сортировка может быть и по нескольким колонкам (если у вас BindingSource под DataGridView-ом) Я выяснял порядок сортировки BindingSource так: Fields - это ListView, в котором я показываю на своей форме по каким колонкам сортировано DGV - DataGridView Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 14:02 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
vagner забывший парольСелектом DataTable не пользовался и удивлен тем, что он сортирует результат если сортировка не задана явно. А по какому столбцу и что - иначе, чем они отсортированы в гриде? ладно, если вы пользуетесь методом Find, то как с помощью него вы производите поиск записей по like'у, а не по строгому соответствию. Насколько я понимаю, без Select'а этого не сделать. сортировка, как я уже описал выше, идет по возрастанию, хотя в исходной табличке данные сортируются в другом виде. vagner забывший парольЕсли честно, то я так и не понял сути проблемы. С одной записью все ясно. А откуда берется несколько? Вы реализуете некий фильтр? изначально вопрос стоял в "грамотности" написанного кода поиска, существует ли другие варианты решения данной проблемы помимо цепочки DataTable-BindingSource-DataGridView. метод DataTable.Select возвращает набор строк, что есть правильно, ведь при поиске строки единичный результат - это скорее всего исключение нежели правило, в большинстве случаев по заданной маске будут находиться более одной записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 14:26 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Strassebahn click да, спасибо за ссылку, но там описано то, что я уже реализовал, мне теперь интересен "поиск Далее". Все уже готово, вот только все еще не поборол сортировку... ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 14:57 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Find использую только для поиска одной записи, а именно - для позиционирования курсора на "старое" место после обновления грида. Фильтры раньше делал селектом к DataTable (но это было давно и тогда я еще не использовал биндинг). Сейчас использую, но нет необходимости ничего фильтровать. Появится необходимость - посмотрю что умеет свойство BindingSource.Filter. В Вашем вопросе меня смутила вот эта фраза автор2) DataTable - метод Select. Возвращает набор найденных строк, но он не может позиционировать строку в гриде. как у Вас увязана фильтрация и позиционирование? Если же говорить об использовании DataGridView, то старайтесь источником всегда ему устанавливать BindingSource. Что Вы сделаете источником для BS - это уже другой вопрос. DataTable достаточно удобный источник, он поддерживает IBindingSource, который собственно и реализует, например Find. А в принципе источником для BS (как, впрочем и для грида) может быть любая коллекция, только для списков и массивов, например, Fiind не будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 14:58 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
vagner забывший парольВ Вашем вопросе меня смутила вот эта фраза автор2) DataTable - метод Select. Возвращает набор найденных строк, но он не может позиционировать строку в гриде. как у Вас увязана фильтрация и позиционирование? значит вот что получается, кстати нашел небольшой глюк (хотя может это я глючу, об этом чуть позже): есть набор записей возвращаемый вьюхой (порядка 15 столбцов, некоторые видимые, некторые нет, нам это не сильно интересно). Пользователь захотел сделать поиск, например, по фамилии, нажимает Ctrl+F (хот-кей на пункт меню) и указывает фильтр поиска, он точно не знает, как оканчивается фамилия человека, допустим он вбил "Ивано". Использование метода BindingSource.Find напрямую отпадает, т.к. там только точное совпадение, следовательно идем в обход, берем метод DataTable.Select. Данный метод поможет больше, ведь в него можно передать like конструкцию. Метод Select возвращает набор DataRow, это и понятно, ведь это лайк, совпадений может быть и 1 и 2 и 102. А вот теперь можно и методом Find воспользоваться, ведь в нашем распоряжении теперь полные записи удовлетворяющих нас строк. Вызываем Find передав в качестве key'я DataRow[0], почему 0? Потому что первая запись в полученном списке. Следующий плюс, что нам дает данная конструкция, пользователя не удовлетворила эта первая (нулевая) запись, он хочет "Поиск далее" вызвать, тут на помощь нам приходит наш набор DataRow, снова вызываем метод Find, но в качестве key'я передаем DataRow[1], т.е. следующая запись в наборе результатов поиска и т.д. Как только дошли до конца набора, счетчик на 0 и позиционирование на первую запись. Все просто, как я вижу. Единственный косяк был в том самом наборе результатов поиска, он возвращался почему то в отсортированном виде, пока я не стал подавать методу Select доп. пар-р уточняющий сортировку. Следовательно, до этого, если грид отсортирован, допустим, по сумме, то метод FindNext (реализованный мной) скакал то вверх то вниз, ведь сортировка по фамилии была. После введения пар-ра сортировки, все нормально. Теперь о косячке: допустим в гриде есть столбцы Фамилия и Имя, есть два человека с одинаковыми именами, но с разными фамилиями, но, при этом, оба удовлетворяют условию поиска, то стоя на колонке с именем, позиционирование методом Find проходит некорректно, всё отрабатывает правильно, DataRow берется что нужно, но само выделение в гриде остается на старом месте. Если же стоять на колонке с фамилией (они у нас разные, если помните), то позиционируется без проблем. Видимо BindingSource.Find не может работать с одинаковыми значениями в одной колонке. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 15:33 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Возможно, я чего-то не понял, но имхо это не лучший способ поиска. Расскажу как я делал: 1. Юзер щелкает по столбцу правой кнопкой - появляется контекстное меню. Один из пунктов - фильтр. 2. Над гридом выезжает панелька с предложением ввести значение фильтра для выбранного столбца (имя столбца я знаю, это по нему щелкал юзер). После ввода каждой буквы делается datatable.select и в гриде остаются только те строки, которые удовлетворяют запросу. Позиционирование на нужную запись осуществляет сам пользователь при помощи мышки. С точки зрения интерфейса - не лучшее решение, но и несложное. Поэтому, когда коллега МСУ выкладывал здесь на форуме код для ввода значения фильтра прямо в заголовке столбца грида, я его сразу скачал. Пока не посмотрел, так как не было необходимости. Это что-то типа фильтров Excel и Access (по крайней мере - старых версий). У Вас несколько иной подход, но подумайте - удобен ли он для пользователя? Опять же ничего не мешает и при Вашем подходе после ввода каждой буквы в окошке фильтра сразу применять текущее значение. Насчет Find - я так понимаю этот метод предназначен именно для позиционирования, а не для фильтрации, поэтому, скорее всего, предполагается, что поиск осуществляется по уникальному столбцу (например - по первичному ключу). ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 16:06 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
vagner забывший парольВозможно, я чего-то не понял, но имхо это не лучший способ поиска. Расскажу как я делал: 1. Юзер щелкает по столбцу правой кнопкой - появляется контекстное меню. Один из пунктов - фильтр. 2. Над гридом выезжает панелька с предложением ввести значение фильтра для выбранного столбца (имя столбца я знаю, это по нему щелкал юзер). После ввода каждой буквы делается datatable.select и в гриде остаются только те строки, которые удовлетворяют запросу. Позиционирование на нужную запись осуществляет сам пользователь при помощи мышки. С точки зрения интерфейса - не лучшее решение, но и несложное. Поэтому, когда коллега МСУ выкладывал здесь на форуме код для ввода значения фильтра прямо в заголовке столбца грида, я его сразу скачал. Пока не посмотрел, так как не было необходимости. Это что-то типа фильтров Excel и Access (по крайней мере - старых версий). У Вас несколько иной подход, но подумайте - удобен ли он для пользователя? Опять же ничего не мешает и при Вашем подходе после ввода каждой буквы в окошке фильтра сразу применять текущее значение. все верно, нисколько не спорю с вами, сам так делал и не раз, но в данной ситуации нельзя пользоваться фильтрацией, такое уж ТЗ и специфика работы программы) в общем, спасибо за интересную беседу. Насколько я понял, все что я делаю, примерно так и делается)) ЗЫ есть ли ссылка на решение коллеги МСУ насчет фильтра аля эксель? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2008, 16:32 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Добрый день. У меня впринципе тоже проблема по поиску в DataGridView. у меня: DataSet ds = new DataSet() DataGridView dgv = new DataGridView(); dgv.DataSet = ds; dgv.DataMember = "Table1" учитывая что здесь говорилось юзать BindingSourse, спрошу еще раз, т.к. не понял до конца в моем примере можно осуществлять поиск в DataGridView? Скажем в DataSet у меня есть уникальный столбец и я знаю конкретное значение из этого столбца. Задача - узнать индекс соответствующей строки в DataGridView. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2008, 13:09 |
|
Поиск в DataGridView
|
|||
---|---|---|---|
#18+
Переберите все строки и найдите нужную. Грид не для поиска, он для отображения. Если же Вы воспользуетесь методом DataTable.Select, то у Вас в гриде останется только одна запись, Вам это нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.08.2008, 14:43 |
|
|
start [/forum/topic.php?fid=20&msg=35299252&tid=1402524]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 9ms |
total: | 135ms |
0 / 0 |