На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Как реализовать связь двух таблиц на форме?
    База данных Access, связь между таблицами Contacts и Phone создавал в Access. На форме разместил 2 DataGridView, один для контактов, другой для телефонов. Однако при выборе контакта в таблице телефонов появляются все телефоны, а не только связанные с контактом. Отношение создал. Подскажите, пожалуйста, как организовать взаимосвязь данных таблиц.
    Прикреплённый файлПрикреплённый файлMyADO.zip (42,23 Кбайт, скачиваний: 182)
      Загрузка таблиц из базы происходит в объекты DataTable. Это типизированнные объекты по одному на таблицу. Эти классы генерируются студией, точнее ADO.NET. Соответственно, на для каждой таблицы генерится адаптер. Собствено, в адаптере есть дефолтный метод Fill(), который и заполняет таблицу из таблицы базы. DataGridView через BindingSource привязывается к соответствующей DataTable и отображает все ее содержание.
      Чтобы фильтровать, нужно либо запилить в адаптер SQL-запрос с фильтром и использовать его вместо Fill(), либо фильтровать уже загруженные Fill() данные через DataView - это представление данных из DataTable, т.е. тот же фильтр по сути. DataView отфильтрованный подставлять в DataGridView. Как-то так.
      Сообщение отредактировано: conalex -
        Должно быть примерно так:
        ExpandedWrap disabled
          // ваш код
          bs.DataSource = ds;
          bs.DataMember = "tbl1ds";
          // ваш код
          bs2.DataSource = bs;
          bs2.DataMember = "relContactPhone";
          // ваш код

        Только DataRelation по раньше создайте, на момент создания второго BindingSource он должен быть уже создан.
          Попробовал, получил ошибку в строках DataMamber (Свойство 'tbl1ds' для DataMember не найдено в DataSource):
          ExpandedWrap disabled
                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";
                }
          Как же сделать правильно?
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0208 ]   [ 19 queries used ]   [ Generated: 19.04.24, 18:03 GMT ]