![]() |
|
Модераторы: gambit |
![]()
|
|
| valent_N |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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); // ?????????????????????? Но компьютер грязно ругается и говорить, что нет такого поля в источнике данных! Формально, это понятно. Но как тогда делать поиски??? |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Можно искать, но не через BindingSource, а с пом. DataTable.Select. Подробнее см. в описании к свойству DataColumn.Expression. Примеры строки запроса:
"Child(Customers2Orders).Quantity = 123" "Parent(Customers2Orders).Name = 'bla-bla-bla' " Где в скобках - имя рилейшена. -------------------- ![]() |
|||
|
||||
| valent_N |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 9.8.2003 Где: Рига, Латвия Репутация: 1 Всего: 1 |
Спасибо за внимание к моему вопросу!
С помощью DataTable.Select искать можно, но это меня не приближает к нужной цели. Дело в том, что мне нужно, чтобы поиск в итоге установил найденную строку в качестве текущей именно в DataGridView-объекте. А кроме того, в общем случае, состав строк в DataTable и в связанном с ней DataGridView может различаться. И, главное, мне нужно найти не просто одну дочернюю строку, зная родительскую, когда отношение 1:1 (1 родитель - один отпрыск) по связующему полю, а нужно среди неограниченного числа дочерних строк найти конкретную строку по произвольному, и именно несвязующему таблицы, полю. Конечно, можно просто перебрать в цикле строки непосредственно в гриде и проверять значения в нужном поле. Этот метод у меня остается на черный день и он, в принципе, мне подходит, если не смогу придумать или узнать что-то более рациональное. У меня на уровнях иерархии как раз немного дочерних записей для каждого отдельного родителя. Но ведь, в другом - более общем случае, перебирать может быть, прийдется большое количество строк. Заодно хотелось бы быть готовым и к этому и сделать более универсальный код. Еще раз большое спасибо за Ваши советы, которые мне очень помогают. С искренним уважением к Вам и Вашей квалификации, Валентин Николаев P.S. А может быть, Вы ответили мне на мой вопрос, но я его не вполне понимаю?! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Тогда не пойдёт, конечно. Вообще, с программным выбором строки у грида явные проблемы
Это как ? Фильтр ?... Почему 1:1 ? Если я делаю связь между 2-мя таблицами, она всегда 1:N, ведь более одной записи в дочерней таблице могут ссылаться на одну запись в родительской. Или чего-то я недопонимаю ? -------------------- ![]() |
|||
|
||||
| valent_N |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 9.8.2003 Где: Рига, Латвия Репутация: 1 Всего: 1 |
Здравствуйте, mr.DUDA !
И фильтр у BindingSource, и DataGridViewRow.Visible=false, и другие случаи. Вы правы! Конечно, 1:N. Извините, пожалуйста, это я в спешке описался. Большое Вам спасибо! |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |