Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.222.12] |
|
Сообщ.
#1
,
|
|
|
База данных Access, связь между таблицами Contacts и Phone создавал в Access. На форме разместил 2 DataGridView, один для контактов, другой для телефонов. Однако при выборе контакта в таблице телефонов появляются все телефоны, а не только связанные с контактом. Отношение создал. Подскажите, пожалуйста, как организовать взаимосвязь данных таблиц.
Прикреплённый файлMyADO.zip (42,23 Кбайт, скачиваний: 182) |
Сообщ.
#2
,
|
|
|
Загрузка таблиц из базы происходит в объекты DataTable. Это типизированнные объекты по одному на таблицу. Эти классы генерируются студией, точнее ADO.NET. Соответственно, на для каждой таблицы генерится адаптер. Собствено, в адаптере есть дефолтный метод Fill(), который и заполняет таблицу из таблицы базы. DataGridView через BindingSource привязывается к соответствующей DataTable и отображает все ее содержание.
Чтобы фильтровать, нужно либо запилить в адаптер SQL-запрос с фильтром и использовать его вместо Fill(), либо фильтровать уже загруженные Fill() данные через DataView - это представление данных из DataTable, т.е. тот же фильтр по сути. DataView отфильтрованный подставлять в DataGridView. Как-то так. |
Сообщ.
#3
,
|
|
|
Должно быть примерно так:
// ваш код bs.DataSource = ds; bs.DataMember = "tbl1ds"; // ваш код bs2.DataSource = bs; bs2.DataMember = "relContactPhone"; // ваш код Только DataRelation по раньше создайте, на момент создания второго BindingSource он должен быть уже создан. |
Сообщ.
#4
,
|
|
|
Попробовал, получил ошибку в строках DataMamber (Свойство 'tbl1ds' для DataMember не найдено в DataSource):
private void Form1_Load(object sender, EventArgs e) { openDb(); ds = new DataSet(); ds.Tables.Add("tbl1ds"); da = new OleDbDataAdapter(); cmd = con.CreateCommand(); cmd.CommandText = "SELECT *FROM Contacts"; da.SelectCommand = cmd; da.FillSchema(ds, SchemaType.Source, "tbl1ds"); da.Fill(ds, "tbl1ds"); bs = new BindingSource(); bs.DataSource = ds.Tables[0]; bsnav.BindingSource = bs; dgv1.DataSource = bs; bs.DataMember = "tbl1ds"; ds.Tables.Add("tbl2ds"); da2 = new OleDbDataAdapter(); cmd = new OleDbCommand(); cmd = con.CreateCommand(); cmd.CommandText = "SELECT *FROM Phones"; da2.SelectCommand = cmd; da2.FillSchema(ds, SchemaType.Source, "tbl2ds"); da2.Fill(ds, "tbl2ds"); DataColumn parentColumn = ds.Tables[0].Columns["idContact"]; DataColumn childColumn = ds.Tables[1].Columns["ContactId"]; DataRelation dr = new DataRelation("relContactPhone", parentColumn, childColumn); ds.Relations.Add(dr); bs2 = new BindingSource(); bs2.DataSource = ds.Tables[1]; bsnav2.BindingSource = bs2; dgv2.DataSource = bs2; bs2.DataMember = "relContactPhone"; } |