| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .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. А может быть, Вы ответили мне на мой вопрос, но я его не вполне понимаю?! |
| Автор: valent_N 27.8.2006, 23:15 | ||
| Здравствуйте, mr.DUDA ! И фильтр у BindingSource, и DataGridViewRow.Visible=false, и другие случаи.
Вы правы! Конечно, 1:N. Извините, пожалуйста, это я в спешке описался. Большое Вам спасибо! |