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


Автор: okaton 10.12.2008, 12:53
Здравствуйте smile Сабж. Простите за тупой вопрос, а как можно выполнить неточный поиск данных в dataGridView из textbox который находится вне dataGridView ?

Автор: MasterOfCode 10.12.2008, 14:53
Посмотри на первую ссылку в блоке: А здесь смотрели?, который под этой темой.

Автор: Unlocker 10.12.2008, 22:01
ссылочка на топик с примерами, первый пост можешь не читать. а дальше идет то, что тебе надо.
,http://forum.vingrad.ru/forum/topic-239235/kw-dgv-dbnull.html

Автор: okaton 10.12.2008, 23:02
Unlocker, спасибо большое, нечто подобное я уже видел, только я не понял как этим пользоваться...
куда это прилаживать в textBoxе и как это связывается с dataGridView?

MasterOfCode  smile а как вы думаете? 5 баллов  smile  хотите плюсик поставлю в категории "рассмешили"? А по существу, я не решился поднимать решенную полугодичную тему smile 

Автор: Unlocker 11.12.2008, 01:32
попробую пояснить попроще.
Код

            StringBuilder baseFilter = new StringBuilder();
            //критерий поиска берем из TextBox'a
            baseFilter.Append("Name LIKE '%"+txtName.Text+"%'");
            //привязка фильтра DataTable.Select() к DataridView
            dgvBooks.DataSource = dsBooks.Books.Select(baseFilter.ToString());


Автор: okaton 11.12.2008, 14:15
Unlocker, спасибо, простите мой кретинизм, возникли вопросы


baseFilter.Append("Name LIKE '%"+txtName.Text+"%'");
Name это имя колонки? Как построить синтаксис поиска во всех колонках? Что такое %? Чем характеризуется точный и не точный поиск?

dsBooks.Books - я правильно понял что dsBooks объект типа DataTable ? Что тогда такое Books?

Автор: MasterOfCode 11.12.2008, 15:24
Цитата(okaton @  11.12.2008,  16:15 Найти цитируемый пост)
Name это имя колонки? 

да
Цитата(okaton @  11.12.2008,  16:15 Найти цитируемый пост)
Как построить синтаксис поиска во всех колонках?

baseFilter.Append("[Name] LIKE '%"+txtName.Text+"%' and [name2] LIKE '%"+txtName2.Text+"%'"); // и так далее
Цитата(okaton @  11.12.2008,  16:15 Найти цитируемый пост)
Что такое %?

% означает что он будет искать вхождения слова с той стороны с которой стоит процент. например:
если ты задал такой параметр поиска = name like '%мир' , то слова 'привет мир', 'мир', 'Эльмир' подпадут под фильтр и отобразяться, а если процент уберешь (name like 'мир' ), то  подподет только 'мир'.
Цитата(okaton @  11.12.2008,  16:15 Найти цитируемый пост)
Чем характеризуется точный и не точный поиск?

точный это когда ты используешь операнды =, <>, >, <, неточный это когда ищешь включения. (см.выше)
Цитата(okaton @  11.12.2008,  01:02 Найти цитируемый пост)
MasterOfCode  smile а как вы думаете? 5 баллов  smile  хотите плюсик поставлю в категории "рассмешили"?

мне на эти плюсики фиолетово  smile 
Цитата(okaton @  11.12.2008,  01:02 Найти цитируемый пост)
А по существу, я не решился поднимать решенную полугодичную тему

нарушаем правила форума)

Автор: okaton 11.12.2008, 16:15
MasterOfCode, спасибо за ответ smile
а по поводу "привязка фильтра DataTable.Select() к DataridView" не подскажите?

Автор: okaton 11.12.2008, 18:08
Непонятность такая

Код

private void toolStripButton7_Click(object sender, EventArgs e)
        {
            StringBuilder baseFilter = new StringBuilder();
            //критерий поиска берем из TextBox'a            
            baseFilter.Append("[Column01_FactoryID] LIKE '%" + toolStripTextBox1.Text + "%' and [Column02_IDComplete] LIKE '%" + toolStripTextBox1.Text + "%'");
            //привязка фильтра DataTable.Select() к DataridView
            dataGridView1.DataSource = table1.Select(baseFilter.ToString());           
        }


После клика по кнопке в DataViewGrid исчезают мои колонки и возникают: RowError (пустая), RowState (колонка заполнена словом Added), Table (пустая), HasErrors (заполнена чекбоксами) - порядка 50 строк

Подскажите пожалуйста, в каком месте ДНК у меня ошибка.

Автор: MasterOfCode 11.12.2008, 18:18
http://forum.vingrad.ru/index.php?showtopic=239235&view=findpost&p=1719837 Я всегда так делал. 

Автор: okaton 11.12.2008, 19:15
Код

        DataTable dt;
        DataView dv;
        private void toolStripButton7_Click(object sender, EventArgs e)
        {
            dt = table1;
            dv = dt.DefaultView;
            string filter;
            filter = "[Column01_FactoryID] LIKE '%" + toolStripTextBox1.Text + "%' 
                         and [Column02_IDComplete] LIKE '%" + toolStripTextBox1.Text + "%'";
            dv.RowFilter = filter;
            dataGridView1.DataSource = dv;
        }


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

тут явно что-то не то... smile 

Автор: Unlocker 11.12.2008, 20:49
Я смотрю, что тема начала активно обсуждаться - вот бы мою недавнюю тему бы так обсуждать начали))).
Поясню свой код
Код

            StringBuilder baseFilter = new StringBuilder();
            //критерий поиска берем из TextBox'a
            baseFilter.Append("Name LIKE '%"+txtName.Text+"%'");
            //привязка фильтра DataTable.Select() к DataridView
            dgvBooks.DataSource = dsBooks.Books.Select(baseFilter.ToString());

StringBuilder - объект для накопления нескольких критериев поиска. Строка - объект неизменяемый, поэтому к ней переходим только в самый последний момент. Метод StringBuilder.Append() cлужит для добавления новых критериев в запрос.
txtName.Text - свойство Text компонента TextBox txtName.
dgvBooks - DataGridView
dsBooks - типизированный DataSet
Books - DataTable
Этот код из моей курсовой работы с минимальными корректировками, поэтому без преамбулы мог показаться сложным.
А вот насчет использования полнотекстовых поисков в одном запросе по нескольким полям должен признать, что просто через "AND" оно нереализуемо. Я пробовал, у меня не получалось. Тут возможно либо придется самому логику прописывать с использованием регулярных выражений при последовательном просмотре полей, либо делать запрос непосредственно к ядру базы данных (даже не знаю, что лучше).

Автор: okaton 11.12.2008, 21:30
Объясните пожалуйста этот момент dsBooks.Books

В моем dataSet нет подобного свойства. 

Создаю так dataSet = new DataSet();         
                    dataSet.Tables.Add(table1);

Автор: Unlocker 11.12.2008, 21:37
DataSet - это мини-СУБД в оперативной памяти. Books - это имя реальной таблицы в БД.
Если его типизировать (вложить в проект схему соответствующих таблиц и связей), то к таблицам БД можно будет обращаться двояко:
1) DataSet.Tables["<имя_таблицы>"] - это случай нетипизированного обращения, работает и в типизированном и нетипизированном DataSet;
2) DataSet.<имя_таблицы> - это случай типизированного обращения. Действует только в типизированных DataSet. После загрузки схемы у объекта появляются свойства - ссылки на соответствующие таблицы.

Автор: okaton 11.12.2008, 22:10
Unlocker, видимо у меня случай нетипизированного DataSet

Подкорректировал код
Код

StringBuilder baseFilter = new StringBuilder();            
baseFilter.Append("[Column01_FactoryID] LIKE '%" + toolStripTextBox1.Text + "%' 
                 and [Column02_IDComplete] LIKE '%" + toolStripTextBox1.Text + "%'");
dataGridView1.DataSource = dataSet.Tables["ParentTable"].Select(baseFilter.ToString());

История повторяется. После клика по кнопке в DataViewGrid исчезают мои колонки и возникают: RowError (пустая), RowState (колонка заполнена словом Added), Table (пустая), HasErrors (заполнена чекбоксами). Это что такое и почему так происходит?

З.Ы. Если не затруднит ответить, подскажите, а как типизировать DataSet?
З.З.Ы. я вам в вашей теме ответил

Автор: Unlocker 11.12.2008, 22:50
Типизация DataSet - штука довольно интересная. если разбираешься в XML, схему можно в блокноте написать, но проще всего в VisualStudio.
Описывать все проблемы типизации на форуме точно не с руки, но могу посоветовать 3 источника знаний (книги):

1) С. Малик "ADO.NET 2.0 для профессионалов" Изд. "Виллиямс", 2006
2) Д. Сеппа "Программирование на Microsoft ADO.NET 2.0" Изд. Питер, 2007
3) Б. Гамильтон "ADO.NET. Сборник рецептов" Изд. Питер, 2005

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

Автор: okaton 12.12.2008, 21:56
Unlocker, типизированные это видимо приведенные к стандарту скриптового языка запроса (SQL)?


Все-таки кто-нибудь может понять в чем ошибка?

Автор: Unlocker 12.12.2008, 22:12
Типизация - это строгий контроль типов со стороны платформы в программном коде. Типизация помогает сократить преобразования типов непосредственно в коде, уменьшить количество ошибок и увеличить быстродействие, связанные с преобразованиями. В общем случае, имея готовую БД в SQL Server, например, имеется возможность типизации прямо из СУБД посредством Visual Studio. К твоим DataSet подгружаются схемы с расширением .xsd, пример которой приложу к посту. Схему типов, как я уже упоминал можно создать и вручную.
Работа адаптеров, для которых и пишутся запросы SQL, от типизации DataSet никак не зависит, потому что это разные классы.

Автор: okaton 13.12.2008, 17:50
Unlocker, Большое спасибо за полные и понятные разъяснения smile

Автор: okaton 17.12.2008, 18:51
Кто-нибудь может сказать почему у меня не работает поиск?


Автор: Unlocker 17.12.2008, 20:30
Как организован поиск? примеры кода или SQL запроса, если имеются...

Автор: okaton 17.12.2008, 20:48
У меня программка в которой 2 dataGridView, которые подключены к двум dataTable, которые подключены к dataSet.
Информация которой заполняются гриды сохраняется в xml, соответственно при старте программы этот фай загружается (или создается).  Это функциональная часть. 
Про SQL запрос сказать ничего не могу, я его сам не создавал. 
Подключений никаких нет.

Последний код который я использовал:
Код

StringBuilder baseFilter = new StringBuilder();            
baseFilter.Append("[Column01_FactoryID] LIKE '%" + toolStripTextBox3.Text + "%' 
                 and [Column02_IDComplete] LIKE '%" + toolStripTextBox3.Text + "%'");
dataGridView1.DataSource = dataSet.Tables["ParentTable"].Select(baseFilter.ToString());


После обработки события (код выше) в DataViewGrid исчезают мои колонки и возникают: RowError (пустая), RowState (колонка заполнена словом Added), Table (пустая), HasErrors (заполнена чекбоксами). Причем, что интересно количество этих строк примерно равно количеству найденых значений.  smile 
Сверх непонятно!

Автор: Unlocker 17.12.2008, 20:58
как я уже упоминал здесь. простое использование двух полнотестковых поисков в одном запросе не дает вообще никакого результата.
пока времени посидеть над книгой Б. Гамильтона "ADO.NET. Cookbook", если выдастся свободный денек, то рекомендую посмотреть.
единственное, что приходит в голову - это использование дополнительной таблицы, в которой будет сохраняться результат одного полнотестового поиска, чтобы потом его пересечь или объединить с другим результатом, но это пока теоретически. на практике, повторюсь, пока нет времени поискать и попробовать.

Автор: okaton 17.12.2008, 21:25
Ладно, один запрос, результат тот же  smile 

Код

baseFilter.Append("Column01_FactoryID LIKE '%" + toolStripTextBox3.Text + "%'");


Книгу (Билл Гамильтон. ADO.NET. Сборник рецептов) сейчас скачаю, посмотрю smile

Автор: Unlocker 17.12.2008, 23:00
у меня запрос такого типа вполне нормально получался.

Автор: MasterOfCode 18.12.2008, 18:18
Цитата(okaton @  17.12.2008,  23:25 Найти цитируемый пост)
Ладно, один запрос, результат тот же

Делай так:
Код

StringBuilder baseFilter = new StringBuilder();            
baseFilter.Append("[Column01_FactoryID] LIKE '%" + toolStripTextBox3.Text + "%' and [Column02_IDComplete] LIKE '%" + toolStripTextBox3.Text + "%'");
DataView dv = dataSet.Tables["ParentTable"].AsDataView();
dv.RowFilter = baseFilter.ToString();
dataGridView1.DataSource = dv;


Добавлено через 1 минуту и 2 секунды
Функция Select у DataTable возвращает DataRow[] и видать массив строк нельзя указывать в качестве источника данных...

Автор: okaton 19.12.2008, 17:22
MasterOfCode, отладчик ругается на .AsDataView()

Цитата

Error    1    'System.Data.DataTable' does not contain a definition for 'AsDataView' and no extension method 'AsDataView' accepting a first argument of type 'System.Data.DataTable' could be found (are you missing a using directive or an assembly reference?)


:(

Автор: MasterOfCode 20.12.2008, 13:49
В этот день не хочеться открывать студию и смотреть какая библиотека отвечает за AsDataView, поэтому делай так:
Код

DataView dv = (DataView)dataSet.Tables["ParentTable"];

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