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


Автор: valent_N 25.8.2006, 13:14
Здравствуйте!
Для отдельно взятой таблицы базы данных, имеющей поле с именем "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); // ??????????????????????
Но компьютер грязно ругается и говорить, что нет такого поля в источнике данных! Формально, это понятно. Но как тогда делать поиски???

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

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

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

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

Автор: mr.DUDA 26.8.2006, 15:07
Цитата(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, ведь более одной записи в дочерней таблице могут ссылаться на одну запись в родительской. Или чего-то я недопонимаю ?

Автор: valent_N 27.8.2006, 23:15
Здравствуйте, 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. Извините, пожалуйста, это я в спешке описался.
Большое Вам спасибо!

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