![]() |
|
Модераторы: gambit |
![]()
|
|
| Amburgen |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 4.12.2006 Репутация: нет Всего: нет |
Помогите пожалуйста вот по какому вопросу.
Есть две таблицы : 1) Таблица людей ([Person_ID], [Person_Name]) 2) Таблица их друзей ([Friend_ID], [Friend_Name], [Person_name] (или [Person_ID] )) Содержимое таблицы Person отображается в одном компоненте (на Windows-ворме) . Во втором компоненте должны отобразится все друзья выбраного Person-а в первом компоненте. При изменении выбраного Person-а в 1-м компоненте, изменяется содержимое во втором компоненте. Я создаю типизированый дата сет dsRelation, в который заливаю 2 таблицы. Прописываю связь между полями
и связываю таблицу с компонентами на форме
Но мне отображает все подряд (всех Friend-ов из таблицы). Подскажите что я делаю не так. |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Видимо, CurrencyManager "не подхватывает" binding у парент-таблицы. Либо не задано ключевое поле у табл. Persons, либо надо заполнить cbPersons.ValueMember (это комбобокс, если я правильно понял).
-------------------- ![]() |
|||
|
||||
| Amburgen |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 4.12.2006 Репутация: нет Всего: нет |
mr.DUDA,
Напишите пожалуйста по-подробнее про CurrencyManager, и про то, как он должен "подхватівать" binding, а также про ValueMember и чем его надо заполнить (я только начинаю работать с базами). |
|||
|
||||
| thomas |
|
||||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Amburgen,
Привет. Если у тебя на форме есть комбобокс, который надо заполнить персонами и тебе надо отобразить всех его друзей в листбоксе или в датагридвью, то я бы сделал так: заполняем комбо
В твоем комбо теперь все персоны. Теперь делаем выбору из другой таблицы всех друзей выбранной персоны и прописываем это в событие изменения выделенного элемента в комбо
или построчно заполняешь листбокс. -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
||||
|
|||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 8 Всего: 232 |
Amburgen, CurrencyManager управляет так называемой "позицией" в источнике данных. Упрощённо механизм binding действует так: мы привязываем контролы к свойствам источника данных, например при изменении свойства объекта MyObject, автоматически изменяется Text в текстбоксе, или Color, и так далее. Когда под источником данных подразумевается один объект, то за сценой работает класс PropertyManager, отслеживая изменения в контроле и наоборот, в свойстве объекта, передавая значения в ту или иную сторону. Другое дело, когда источник данных представляет множество объектов, проще говоря - массив или список (как DataTable, который состоит из списка DataRow). Здесь срабатывает CurrencyManager, в обязанности которого входит управление позицией в массиве/списке. Как именно выбирается nnnManager - зависит от природы источника данных; этим управляет WinForms. Так вот, CurrencyManager расчитан на некоторые правила, по которым строится источник данных, для того чтобы корректно определять позицию в нём: для DataTable таким правилом является наличие первичного ключа (primary key). В дизайнере датасета можно настроить первичный ключ, используя контекстное меню колонки таблицы.
По поводу ValueMember, для компонента ComboBox именно ValueMember задаёт (определяет) свойство источника данных, откуда CurrencyManager получает позицию. В общем случае, любая таблица датасета должна содержать ID (идентификатор). Имя поля, содержащего идентификатор записи таблицы, нужно поместить в ValueMember (точно так же как в DisplayMember помещается имя поля таблицы, содержащего строки для вывода в комбобоксе). То есть, если не определить ValueMember, комбобокс будет связан с таблицей, но записи будут отображаться без связи с их ID - выбор какой-то конкретной записи не приведёт ни к чему, т.к. binding завязан именно на ID (первичный ключ). thomas, можно и вручную всё делать: навесить обработчик на изменение текущей записи в комбобоксе, и динамически управлять соответствующими контролами. Но в случае более-менее сложной формы (множество контролов со связями) намного выгоднее использовать стандартные механизмы управления данными, чем изобретать свои. А изобретать придётся (binding скрывает от разработчика немалое количество "ненужной", грязной работы). -------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [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. |