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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Родственные таблицы, Отображение "детей" выбраного Row-a 
:(
    Опции темы
Amburgen
Дата 4.12.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 таблицы. Прописываю связь между полями 
Код

dataset.Relations.Add("Person_Friend", dataset.Tables["Person"].Columns["Person_Name"], dataset.Tables["Friend"].Columns["Person_Name"]);
dataset.Relations[0].Nested = true;

и связываю таблицу с компонентами на форме
Код

        dataset.LoadData();
        dsRelation dataset = new dsRelation();
        BindingSource BindPerson = new BindingSource();
        BindingSource BindFriend = new BindingSource();

             BindPerson.DataSource = dataset.Person;
            BindFriend.DataSource = dataset.Friend;

            gvPerson.DataSource = BindPerson;
            gvFriend.DataSource = BindFriend;
            
            cbPerson.DataSource = BindPerson;
            cbPerson.DisplayMember = "Person_Name";
            lbFriend.DataSource = BindFriend;
            lbFriend.DisplayMember = "Friend_Name";


 Но мне отображает все подряд (всех Friend-ов из таблицы).
Подскажите что я делаю не так.
PM MAIL   Вверх
mr.DUDA
Дата 4.12.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Видимо, CurrencyManager "не подхватывает" binding у парент-таблицы. Либо не задано ключевое поле у табл. Persons, либо надо заполнить cbPersons.ValueMember (это комбобокс, если я правильно понял).


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


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 4.12.2006

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



mr.DUDA, 
Напишите пожалуйста по-подробнее про CurrencyManager, и про то, как он должен "подхватівать" binding, а также про ValueMember  и чем его надо заполнить (я только начинаю работать с базами).
PM MAIL   Вверх
thomas
Дата 4.12.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



Amburgen, 
Привет.
Если у тебя на форме есть комбобокс, который надо заполнить персонами и тебе надо отобразить всех его друзей в листбоксе или в датагридвью, то я бы сделал так:

заполняем комбо
Код

sql= "SELECT namePerson FROM tablePerson"

Command.CommandText=sql
DataAdapter=New DataAdapter(Command)
DataAdapter.Fill(DataSet, "person")

for each DataRow dr in DataSeT.Tables("person").Rows
ComboBox.Items.Add(dr(0))


В твоем комбо теперь все персоны.
Теперь делаем выбору из другой таблицы всех друзей выбранной персоны 
и прописываем это в событие изменения выделенного элемента в комбо

Код

sql = "SELECT * FROM tableFriend WHERE personName= " + ComboBox.SelectedItem.ToString()

Command.CommandText=sql
DataAdapter=New DataAdapter(Command)
DataAdapter.Fill(DataSet, "friend")

DataGridView.DataSource = DataSet
DataGridView.DataMember= "friend"


или 
построчно заполняешь листбокс.



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
mr.DUDA
Дата 4.12.2006, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 скрывает от разработчика немалое количество "ненужной", грязной работы).


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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