powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поиск в DataGridView
26 сообщений из 26, показаны все 2 страниц
Поиск в DataGridView
    #34435612
dred_root
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ!
Не подскажите как произвести поиск в DataGridView по содержимому в ячейке, без применения циклов. Т.е. найти строку, в заданном столбце, содержащую введенную фразу.
GridView заполняется на основании DataSource.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34435722
Фотография SeeJay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юзай BindingSource !
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34435723
Фотография SeeJay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоесть
Код: plaintext
1.
this.BindingSource.Find("Name", "Jhonatan");
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34437914
dred_root
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
А как по найденной в BindingSource строке определить строку в DataGridView?
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34437931
dred_root
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо. Все получилос.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34438022
dred_root
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще один вопрос.
Как сделать в BindingSource поиск по неполному значению поля?

Т.е. что-от на пример:

DataTable dt = new DataTable();
....
....

DataRow[] dr = dt.Select(Colum_name + " LIKE '" + value + "*'");
int row_index = dt.Rows.IndexOf(dr[0]);

но только не используя DataTable, а сразу в BindingSource.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34440675
Фотография SeeJay
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так. Через 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.
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            try
            {
                CurrencyManager currencyManager = (CurrencyManager)BindingContext[dgMain.DataSource, dgMain.DataMember]; \\dgMain - это ГРИД
                if (tbMask.Text == string.Empty) \\tbMask - это ТекстБокс
                {
                    currencyManager.Position = -1;
                    return;
                }
                DataView dataView = (DataView)currencyManager.List;
                string query = string.Format("{0} LIKE '{1}%'", Convert.ToString(COL_NAME), Convert.ToString(tbMask.Text)); \\ COL_NAME - имя колонки
                DataTable dataTable = dataView.Table;
                DataRow[] rows = dataTable.Select(query, dataView.Sort);
                if (rows.Length > 0)
                {
                    DataRow[] tempRows;
                    if (dataView.Sort == string.Empty)
                    {//Если сортировка не задана - просто находим заданную строку в массиве строк DataTable
                        tempRows = new DataRow[dataView.Count];
                        dataTable.Rows.CopyTo(tempRows, 0);
                    }
                    else
                        tempRows = dataTable.Select(dataView.RowFilter, dataView.Sort);
                    int rowIndex = Array.IndexOf(tempRows, rows[0]);
                    currencyManager.Position = rowIndex;
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34441731
dred_root
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.
До этого я додумался. А как вот сделать это же, но без использования DataTable и DataRow.
Хотелось бы чтоб это все выполнялось в BindingSource.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #34441765
dred_root
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принципе эту операцию можно сделать еще проще
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
DataGridView DGView = new DataGridView()
BindingSource BSource = new System.Windows.Forms.BindingSource()

DataTable dt = new DataTable();
DataRow[] dr = new DataRow[0];           

string col_name;
string value;

BSource.DataSource = dt;
DGView.DataSource = BSource;

if (value.Length > 0)            
            dr = dt.Select("Convert(" + col_name + ", 'System.String')" + " LIKE '" + value + "*'");

try
{                
      this.BSource.Position = this.BSource.Find(field, dr[0][col_name].ToString());
}
catch (Exception ex)
{
       //
}
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Поиск в DataGridView
    #35299134
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите за некропостинг, но хотел выяснить один вопрос, а плодить одинаковые темы не к чему.

В дот НЕТе недавно, до этого 5 лет был в делфях. Начал работать с БД (АДО дот НЕТ), модель конечно отличается от делфефской, но тем не менее, жить можно)) Такой вопрос (непосредственно связанный с поиском):

как я понял, поиск можно сделать используя:
1) DataView - но только по ключу сортировки, что меня не устраивает, мне нужно запись при текущем положении строк;
2) DataTable - метод Select. Возвращает набор найденных строк, но он не может позиционировать строку в гриде.
3) BindingSource - метод Find и свойство Position делают всё как мне нужно, при этом используется результат выполнения п.2.

Это пока, что смог найти и узнать о поиске данных в дот НЕТ. Если у кого есть ещё варианты, буду рад выслушать.

Теперь пример того, как я делаю:

- раз, поиск и позиционирование только ч/з биндинг, то его и нужно ставить в датаСорс грида

Код: plaintext
1.
DataGridView.DataSource = new BindingSource();
(DataGridView.DataSource as BindingSource).DataSource = DataTable/DataSet.Tables[i];

- реализация поиска:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
string field = DataGridView.Columns[DataGridView.SelectedCells[0].ColumnIndex].Name;
BindingSource bSource = (DataGridView.DataSource as BindingSource);
DataTable dTable = (bSource.DataSource as DataTable);
DataRow[] rows = dTable.Select(String.Format(field + " like '%{0}%'", Value));
if (rows != null)
{
    int idx = dTable.Rows.IndexOf(rows[0]);
    bSource.Position = bSource.Find(field, rows[0][field].ToString());
}

это правильное решение или же есть более грамотные построения?
_______________
"Если человек не знает, куда он плывет, для него нет благоприятных ветров". Сенека
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299252
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понял? Вам нужно найти одну запись или их может быть и более одной? Если одну - то я пользуюсь методом BindingSource.Find. А если несколько - то на что Вы хотите поставить курсор?
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299355
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagner забывший парольНе понял? Вам нужно найти одну запись или их может быть и более одной? Если одну - то я пользуюсь методом BindingSource.Find. А если несколько - то на что Вы хотите поставить курсор?
да, для поиска одной записи, по коду выше, также использован метод Find.

но результат может возвращать более одной строки, следовательно, нужно реализовать метод FindNext . Эту проблему я также обошел, создал класс поиска, он сохраняет результат поиска DataRow[] , а затем, при вызове метода FindNext , увеличиваем наш индекс (в коде выше, было указано 0, т.е. первую берем запись).

во время реализации метода FindNext возник такой вопрос: метод Select возвращает набор упорядоченных строк (например, при буквенном поле, в алфавитном порядке). А как ему сказать не делать этого и оставить это как есть гриде?
у Select 'а есть вариант подать на вход пар-р Sort , следовательно, нужно выяснить какая сейчас сортировка в гриде и передать. DataGridView.SortedColumn и DataGridView.SortOrder содержат всю необходимую информацию. НО, только в том случае, когда пользователь кликнет по столбцу для сортировки, если же ничего не трогалось, то ошибка - DataGridView.SortedColumn не определен. А что делать, если в начальном запросе уже была объявлена сортировка в области order by, как это передать гриду, только явно?
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299396
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Селектом DataTable не пользовался и удивлен тем, что он сортирует результат если сортировка не задана явно. А по какому столбцу и что - иначе, чем они отсортированы в гриде? Если честно, то я так и не понял сути проблемы. С одной записью все ясно. А откуда берется несколько? Вы реализуете некий фильтр?
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299747
IApple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сортировка может быть и по нескольким колонкам (если у вас 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.
                BS = (BindingSource)this.DGV.DataSource;
                if (BS.SupportsAdvancedSorting)
                {   // поддерживает сортировку по нескольким колонкам
                    this.AL = new ArrayList(); // сюда попадут колонки, по которым сортировано
                    if (BS.IsSorted)
                    {
                        for (int i = 0; i < BS.SortDescriptions.Count; i++)
                        {
                            String s = BS.SortDescriptions[i].PropertyDescriptor.Name;
                            DataGridViewColumn X = null;
                            int j = DGV.Columns.Count;
                            while (X == null && j>0)
                            {
                                j--;
                                if (DGV.Columns[j].DataPropertyName == s)
                                {
                                    X = DGV.Columns[j];
                                    this.AL.Add(X);
                                    ListViewItem v = this.Fields.Items.Add(X.HeaderText);
                                    if (BS.SortDescriptions[i].SortDirection == ListSortDirection.Ascending)
                                         v.ImageIndex = 1;  // по возростанию
                                    else v.ImageIndex = 2; // по убыванию
                                    v.SubItems.Add(X.DataPropertyName);
                                    v.Name = X.DataPropertyName;
                                }
                            }
                        }
                    }
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299838
Фотография Strassebahn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299863
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagner забывший парольСелектом DataTable не пользовался и удивлен тем, что он сортирует результат если сортировка не задана явно. А по какому столбцу и что - иначе, чем они отсортированы в гриде?
ладно, если вы пользуетесь методом Find, то как с помощью него вы производите поиск записей по like'у, а не по строгому соответствию. Насколько я понимаю, без Select'а этого не сделать.

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

vagner забывший парольЕсли честно, то я так и не понял сути проблемы. С одной записью все ясно. А откуда берется несколько? Вы реализуете некий фильтр?
изначально вопрос стоял в "грамотности" написанного кода поиска, существует ли другие варианты решения данной проблемы помимо цепочки DataTable-BindingSource-DataGridView.

метод DataTable.Select возвращает набор строк, что есть правильно, ведь при поиске строки единичный результат - это скорее всего исключение нежели правило, в большинстве случаев по заданной маске будут находиться более одной записи.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299989
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Strassebahn click
да, спасибо за ссылку, но там описано то, что я уже реализовал, мне теперь интересен "поиск Далее". Все уже готово, вот только все еще не поборол сортировку...
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35299997
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Find использую только для поиска одной записи, а именно - для позиционирования курсора на "старое" место после обновления грида. Фильтры раньше делал селектом к DataTable (но это было давно и тогда я еще не использовал биндинг). Сейчас использую, но нет необходимости ничего фильтровать. Появится необходимость - посмотрю что умеет свойство BindingSource.Filter.

В Вашем вопросе меня смутила вот эта фраза

автор2) DataTable - метод Select. Возвращает набор найденных строк, но он не может позиционировать строку в гриде.


как у Вас увязана фильтрация и позиционирование?

Если же говорить об использовании DataGridView, то старайтесь источником всегда ему устанавливать BindingSource. Что Вы сделаете источником для BS - это уже другой вопрос. DataTable достаточно удобный источник, он поддерживает IBindingSource, который собственно и реализует, например Find.
А в принципе источником для BS (как, впрочем и для грида) может быть любая коллекция, только для списков и массивов, например, Fiind не будет работать.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35300161
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 не может работать с одинаковыми значениями в одной колонке.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35300302
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно, я чего-то не понял, но имхо это не лучший способ поиска. Расскажу как я делал:
1. Юзер щелкает по столбцу правой кнопкой - появляется контекстное меню. Один из пунктов - фильтр.
2. Над гридом выезжает панелька с предложением ввести значение фильтра для выбранного столбца (имя столбца я знаю, это по нему щелкал юзер). После ввода каждой буквы делается datatable.select и в гриде остаются только те строки, которые удовлетворяют запросу. Позиционирование на нужную запись осуществляет сам пользователь при помощи мышки.

С точки зрения интерфейса - не лучшее решение, но и несложное. Поэтому, когда коллега МСУ выкладывал здесь на форуме код для ввода значения фильтра прямо в заголовке столбца грида, я его сразу скачал. Пока не посмотрел, так как не было необходимости. Это что-то типа фильтров Excel и Access (по крайней мере - старых версий).

У Вас несколько иной подход, но подумайте - удобен ли он для пользователя? Опять же ничего не мешает и при Вашем подходе после ввода каждой буквы в окошке фильтра сразу применять текущее значение.

Насчет Find - я так понимаю этот метод предназначен именно для позиционирования, а не для фильтрации, поэтому, скорее всего, предполагается, что поиск осуществляется по уникальному столбцу (например - по первичному ключу).
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35300385
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vagner забывший парольВозможно, я чего-то не понял, но имхо это не лучший способ поиска. Расскажу как я делал:
1. Юзер щелкает по столбцу правой кнопкой - появляется контекстное меню. Один из пунктов - фильтр.
2. Над гридом выезжает панелька с предложением ввести значение фильтра для выбранного столбца (имя столбца я знаю, это по нему щелкал юзер). После ввода каждой буквы делается datatable.select и в гриде остаются только те строки, которые удовлетворяют запросу. Позиционирование на нужную запись осуществляет сам пользователь при помощи мышки.

С точки зрения интерфейса - не лучшее решение, но и несложное. Поэтому, когда коллега МСУ выкладывал здесь на форуме код для ввода значения фильтра прямо в заголовке столбца грида, я его сразу скачал. Пока не посмотрел, так как не было необходимости. Это что-то типа фильтров Excel и Access (по крайней мере - старых версий).

У Вас несколько иной подход, но подумайте - удобен ли он для пользователя? Опять же ничего не мешает и при Вашем подходе после ввода каждой буквы в окошке фильтра сразу применять текущее значение.
все верно, нисколько не спорю с вами, сам так делал и не раз, но в данной ситуации нельзя пользоваться фильтрацией, такое уж ТЗ и специфика работы программы) в общем, спасибо за интересную беседу. Насколько я понял, все что я делаю, примерно так и делается))

ЗЫ есть ли ссылка на решение коллеги МСУ насчет фильтра аля эксель?
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35300412
vagner забывший пароль
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здесь
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35468649
teepok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
У меня впринципе тоже проблема по поиску в DataGridView.
у меня:
DataSet ds = new DataSet()
DataGridView dgv = new DataGridView();
dgv.DataSet = ds;
dgv.DataMember = "Table1"

учитывая что здесь говорилось юзать BindingSourse, спрошу еще раз, т.к. не понял до конца в моем примере можно осуществлять поиск в DataGridView? Скажем в DataSet у меня есть уникальный столбец и я знаю конкретное значение из этого столбца. Задача - узнать индекс соответствующей строки в DataGridView.
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35468970
vagner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переберите все строки и найдите нужную. Грид не для поиска, он для отображения. Если же Вы воспользуетесь методом DataTable.Select, то у Вас в гриде останется только одна запись, Вам это нужно?
...
Рейтинг: 0 / 0
Поиск в DataGridView
    #35469016
Фотография WYPMAH
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teepokюзать BindingSourse
саме себе и ответили ;)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Поиск в DataGridView
    #38735279
visak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как в DataGridView организовать выделение цветом повторяющихся значений в одном столбце?
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поиск в DataGridView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]