Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Поиск в наборе даных


Автор: FreakK 12.3.2007, 01:20
Здраствуйте. У меня такой вопрос: есть форма 
на ней DataGridView, BindingSource, TableAdapter и поле для поиска



Мне нужно в наборе найти запись, где значение поля name (строковое)
начинаетса или содержыт текст строки srt1.

пробовал 

agentsBindingSource.Find("name",str1);

но находит только если значения полностю совпадают...

помогите незнаю что делать.... smile 

Автор: archimed7592 12.3.2007, 01:52
м. б. agentsBindingSource.Find("name",String.Format ("%{0}%", str1))...по крайней мере, в sql запросе должно быть select ... from ... where name = '%bla-bla-bla%' вроде как smile

Автор: FreakK 12.3.2007, 15:53
нипошло :'(    smile 

Автор: mr.DUDA 12.3.2007, 16:16
Найти датасет, DataTable, выполнить Select c условием по LIKE '%bla-bla-bla%'

Автор: FreakK 12.3.2007, 22:56
нет мне нужно именно виделить в текущем наборе конкретную запись...
а не изменить запрос

Автор: NET_or_not_NET 13.3.2007, 12:58
Поле "name" может быть отсортированно?  

Автор: NET_or_not_NET 13.3.2007, 14:55
Не самое изащное решение, но РАБОЧЕЕ! если я конечно правильно понял, что надо,
а надо:
Цитата

виделить в текущем наборе конкретную запись...

оставив текущий набор без изменений... да? я имею ввиду изменений в датагриде (т.е. организовать горячий поиск)

если так то :

предположим что в Вашем наборе есть как минимум два поля  - ourname и idrow (некое id),
 а также :
DataGridView   -  DataGridView1
BindingSource  -  BindingSource1
textBox            -  textBox1                -  искомая строка или её часть

Код

            
            int idx = 1;       //это индекс в гриде

            DataView dataView1 = new DataView(dataSet1.Ваша Таблица);  // это дата виев как без него НЕ знаю!!

            dataView1.RowFilter = "ourname like '" + textBox1.Text + "%'";  // это наш фильтр, который будет выберать нужные нам строки

            foreach (DataRowView row1 in dataView1)
            {

                idx = (int)row1.Row["idrow"]; // смысл в следующем: из получившегося набора (который выбрал фильтр, 
                                                               // например " ourname like 'АВС%' ") берем первую строку, почему первую - 
                                                               // предпологаем что Грид отсортирован, но даже если нет - Мы то всеравно найдем
                                                               // просто это будет не так красиво как при отсортированном 

                break;
            }            

            dataGridView1.CurrentCell = dataGridView1[индекс Колонки ourname из грида, BindingSource1.Find("idrow", idx)];
            // делаем текущей ячейкой на гриде найденую 

замечу dataView1 не привязываем к Гриду (ведь нам не нужно чтобы менялся набор)

 smile  - согласен не фонтан, но ничего больше пока в голову не лезет   smile 

этот код можно использовать как при нажатии на некой кнопке (например "Найти") или при обработке нажатия кнопок в textBox1 будет так называемы "горячий поиск"

Возможно правильне будет использовать классы BindingContext и CurrencyManager, надо покапаться!

Вариант 2:
можно убрать BindingSource1, завязать все на dataView1 и не мучаться

Задам вопрос  - 
mr.DUDA а нельзя как нибуть вынести в отдельный блок вопросы по ГридВиев, ведь не всегда (а то и всегда) решение проблем с этим контролом выходит за рамки ВиндовсФормс , это могут быть проблемы конкретно с адаптером или той БД котороя используеться, просто не понятно где задовать вопрос , вроде проблема с контролом а решение может быть с БД, 
и например назвать тему так "А вот как я мучаюсь с dataGridView..." 

С Уважением  NET_or_not_NET

P.S. прошу прощения у FreakK просто не хотелось создавать новую тему! С Уважением  NET_or_not_NET

Автор: mr.DUDA 13.3.2007, 15:25
Цитата(FreakK @  12.3.2007,  21:56 Найти цитируемый пост)
нет мне нужно именно виделить в текущем наборе конкретную запись...а не изменить запрос

Так я и не предлагаю менять запрос, а всего лишь выбрать из DataTable нужные строки (DataRow) методом DataTable.Select. При условии, что датагрид связан с DataSet-ом в качестве источника данных.

Автор: Stepan_Lameroff 13.3.2007, 16:49
Контрол, работающий(может быть  smile ) по принципу, озвученному mr.DUDA

Автор: NET_or_not_NET 13.3.2007, 17:14
А можно и так как в премере который выложил Stepan_Lameroff
Цитата

Код

           
            DataRow[] dr = dt.Select(findIn + " like '" + find + "%'");
            if (dr.Length > 0)
            {
                string FirstValue = dr[0][findIn].ToString();
                index = bindingSource.Find(property, FirstValue);
                this.OnItemFound(new ItemFoundEventArgs(index));
            }


разница в том что вместо dataView1 и RowFilter
используеться DataRow[] dr и датасет.Select  

и это правильно  smile , но алгоритм действий тотже   smile 

Автор: FreakK 17.3.2007, 17:20
Пасиба всем вопщем получилось то что нужно))  smile 

Автор: mr.DUDA 17.3.2007, 19:05
Да падёт на тебя его милостивая тень  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)