Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в дочернем DataGridView иерархии гридов, Как найти запись по нужному полю? 
V
    Опции темы
valent_N
Дата 25.8.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: 1
Всего: 1



Здравствуйте!
Для отдельно взятой таблицы базы данных, имеющей поле с именем "fieldName" имется соответствующий табличный объект table в dataset'е, отображаемый контролем DataGridView с подключением к источнику данных с помощью компонента BindingSource bs. Как известно, поиск соответствующей строки в гриде со значением Value в этом поле производится, например, с помощью объекта bs следующим образом:
    bs.Position = bs.Find("fieldName", Value);
Значения свойств bs перед поиском в этом случае:
    bs.DataSource = dataset;
    bs.DataMember = table;

ВОПРОС:
А как производить поиск по иерархии связянных отношениями "родитель-отпрыск" таблиц? То есть, если искать в дочерних таблицах, то что нужно указывать в качестве имени поля?

Например, есть цепочка связанных таблиц в dataset'е - T1, T2,T3, ... . Каждая предыдущая является родителем последующей. У каждой таблицы есть свой грид (DataGridView) - G1, G2, G3, ..., соответственно, который в качестве источника данных (Gn.DataSource=BSn) имеет BindingSource BSn (n=1, 2, 3, ...). Нужно произвести в каждой из таблиц поиски по полю "F1", "F2", "F3", соответственно. В этом случае, для самой свойств объекта BS1 первой таблицы (аналогично вышеупомянутому случаю отдельной таблицы) имеем:
    BS1.DataSource = dataset;
    BS1.DataMember = T1;
В случае таблицы T2 и ее BS2 имеем:
    BS2.DataSource = BS1;
    BS2.DataMember = "Relation_2_1"; // Название отношения между таблицами 2 и 1 в dataset'е
В случае таблицы T3 и ее BS3 имеем:
    BS3.DataSource = BS2;
    BS3.DataMember = "Relation_3_2"; // Название отношения между таблицами 3 и 2 в dataset'е
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Поиск в первом гриде ведется также, как указано выше:
    BS1.Position = BS1.Find("F1", Value1);
А КАК ДАЛЬШЕ?
    BS2.Position = BS2.Find("F2", Value2); // ??????????????????????
Но компьютер грязно ругается и говорить, что нет такого поля в источнике данных! Формально, это понятно. Но как тогда делать поиски???

PM MAIL   Вверх
mr.DUDA
Дата 25.8.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Можно искать, но не через BindingSource, а с пом. DataTable.Select. Подробнее см. в описании к свойству DataColumn.Expression. Примеры строки запроса:

"Child(Customers2Orders).Quantity = 123"
"Parent(Customers2Orders).Name = 'bla-bla-bla' "

Где в скобках - имя рилейшена.


--------------------
user posted image
PM MAIL WWW   Вверх
valent_N
Дата 25.8.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: 1
Всего: 1



Спасибо за внимание к моему вопросу!
С помощью DataTable.Select искать можно, но это меня не приближает к нужной цели. Дело в том, что мне нужно, чтобы поиск в итоге установил найденную строку в качестве текущей именно в DataGridView-объекте. А кроме того, в общем случае, состав строк в DataTable и в связанном с ней DataGridView может различаться. И, главное, мне нужно найти не просто одну дочернюю строку, зная родительскую, когда отношение 1:1 (1 родитель - один отпрыск) по связующему полю, а нужно среди неограниченного числа дочерних строк найти конкретную строку по произвольному, и именно несвязующему таблицы, полю. Конечно, можно просто перебрать в цикле строки непосредственно в гриде и проверять значения в нужном поле. Этот метод у меня остается на черный день и он, в принципе, мне подходит, если не смогу придумать или узнать что-то более рациональное. У меня на уровнях иерархии как раз немного дочерних записей для каждого отдельного родителя. Но ведь, в другом - более общем случае, перебирать может быть, прийдется большое количество строк. Заодно хотелось бы быть готовым и к этому и сделать более универсальный код.
Еще раз большое спасибо за Ваши советы, которые мне очень помогают.
С искренним уважением к Вам и Вашей квалификации,
Валентин Николаев
P.S. А может быть, Вы ответили мне на мой вопрос, но я его не вполне понимаю?!
PM MAIL   Вверх
mr.DUDA
Дата 26.8.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Цитата(valent_N @  25.8.2006,  18:48 Найти цитируемый пост)
С помощью DataTable.Select искать можно, но это меня не приближает к нужной цели. Дело в том, что мне нужно, чтобы поиск в итоге установил найденную строку в качестве текущей именно в DataGridView-объекте.

Тогда не пойдёт, конечно. Вообще, с программным выбором строки у грида явные проблемы smile

Цитата(valent_N @  25.8.2006,  18:48 Найти цитируемый пост)
А кроме того, в общем случае, состав строк в DataTable и в связанном с ней DataGridView может различаться.

Это как ? Фильтр ?...

Цитата(valent_N @  25.8.2006,  18:48 Найти цитируемый пост)
 И, главное, мне нужно найти не просто одну дочернюю строку, зная родительскую, когда отношение 1:1 (1 родитель - один отпрыск) по связующему полю, а нужно среди неограниченного числа дочерних строк найти конкретную строку по произвольному, и именно несвязующему таблицы, полю.

Почему 1:1 ? Если я делаю связь между 2-мя таблицами, она всегда 1:N, ведь более одной записи в дочерней таблице могут ссылаться на одну запись в родительской. Или чего-то я недопонимаю ?


--------------------
user posted image
PM MAIL WWW   Вверх
valent_N
Дата 27.8.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: 1
Всего: 1



Здравствуйте, mr.DUDA !


Цитата(mr.DUDA @  26.8.2006,  15:07 Найти цитируемый пост)
Это как ? Фильтр ?...

И фильтр у BindingSource, и DataGridViewRow.Visible=false, и другие случаи.


Цитата(mr.DUDA @  26.8.2006,  15:07 Найти цитируемый пост)
Почему 1:1 ? Если я делаю связь между 2-мя таблицами, она всегда 1:N, ведь более одной записи в дочерней таблице могут ссылаться на одну запись в родительской. Или чего-то я недопонимаю ? 


Вы правы! Конечно, 1:N. Извините, пожалуйста, это я в спешке описался.
Большое Вам спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.