Украина, Киев |
Объект DataView. Вывод связанных таблиц
Вывод связанных таблиц в два элемента DataGrid1
Наиболее часто встречаемая задача при разработке приложений, связанных с базами данных: одновременный вывод двух таблиц на форму, причем при перемещении по записям главной таблицы в дочерней автоматически отображаются связанные записи. Мы сделаем два приложения - одно будет создано с использованием визуальных инструментов студии, другое - полностью программно. Создайте новый Windows-проект и назовите его Visual2DataGrid2Table. Из окна Toolbox перетаскиваем на форму элемент DataGrid, свойству Dock этого элемента устанавливаем значение Bottom. Добавляем элемент Splitter, его свойству Dock также устанавливаем значение Bottom. Наконец, перетаскиваем второй DataGrid, свойству Dock устанавливаем значение Fill. Дополнительно определяем следующие свойства элементов:
Переходим на вкладку Data окна Toolbox, перетаскиваем на форму элемент DataSet, в поле его свойства Name вводим значение "dsTourists". В появившемся окне Add DataSet выбираем "Untyped DataSet". Выделяем объект dataSet1 и в окне Properties, в поле свойства Tables нажимаем на кнопку(...). В редакторе Tables Collection Editor нажимаем кнопку "Add" для добавления таблицы "Туристы" (TableName - "Туристы", Name - "dtTourists"). В поле свойства Columns нажимаем на кнопку(...) и создаем следующие столбцы:
Поле Column1, свойство | Значение |
---|---|
ColumnName | Код туриста |
DataType | System.Int32 |
Unique | True |
Name | dcTouristID |
Аналогично, в редакторе Tables Collection Editor создаем таблицу "Информация о туристах", а затем в редакторе Columns Collection Editor создаем ее поля:
Поле Column1, свойство | Значение |
---|---|
ColumnName | Код туриста |
DataType | System.Int32 |
Unique | True |
Name | dcInfoTouristsID |
Завершив настройку таблиц и колонок, переходим к определению связи между таблицами. Выделяем объект dataSet1, в окне Properties в поле свойства Relations щелкаем на кнопку(...). В появившемся редакторе Relation Collection Editor нажимаем кнопку "Add" и создаем отношение "Дополнительная_информация" между таблицами по ключевому полю "Код туриста". Завершив работу с редактором, переходим в код формы. Подключаем пространство имен для работы с базой данных Microsoft Access:
using System.Data.OleDb;
Добавляем строки для подключения к базе и извлечения данных:
string connectionString = @"Provider=""Microsoft.Jet.OLEDB.4.0""; Data Source=""D:\Uchebnik\Code\Glava1\BDTur_firm.mdb""; User ID=Admin;Jet OLEDB:Encrypt Database=False"; string commandText = "SELECT [Код туриста], Фамилия, Имя, Отчество FROM Туристы"; string commandText2 = "SELECT [Код туриста], [Серия паспорта], Город, Страна, Телефон, Индекс FROM [Информация о туристах]";
В конструкторе формы создаем объекты для заполнения данными DataSet:
public Form1() { InitializeComponent(); OleDbConnection conn = new OleDbConnection(connectionString); OleDbCommand myCommand = new OleDbCommand(); myCommand.Connection = conn; myCommand.CommandText = commandText; OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = myCommand; OleDbCommand myCommand2 = new OleDbCommand(); myCommand2.Connection = conn; myCommand2.CommandText = commandText2; OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter(); dataAdapter2.SelectCommand = myCommand2; conn.Open(); dataAdapter.Fill(dsTourists.Tables["Туристы"]); dataAdapter2.Fill(dsTourists.Tables["Информация о туристах"]); conn.Close(); dgTourists.DataSource = dsTourists; dgTourists.DataMember = "Туристы"; dgInfoTourists.DataSource = dsTourists; dgInfoTourists.DataMember = "Туристы.Дополнительная_информация"; }
Запускаем приложение (рис. 9.14):
увеличить изображение
Рис. 9.14. Готовое приложение Visual2DataGrid2Table. При перемещении по записям таблицы "Туристы" автоматически выводятся связанные записи в таблице "Информация о туристах"
Ключевым моментом здесь является определение связи "Дополнительная_информация" в содержимом элемента dgInfoTourists:
dgInfoTourists.DataMember = "Туристы.Дополнительная_информация";
Эта же связь доступна и в окне родительской таблицы - при нажатии на гиперссылку возвращается связанная запись.
В программном обеспечении к курсу вы найдете приложение Visual2 DataGrid2Table (Code\Glava4\ Visual2DataGrid2Table).
Рассмотрим теперь программную реализацию этого же приложения. Создайте новый Windows-проект и назовите его "Programm2DataGrid2Table". Скопируем из проекта Visual2DataGrid2Table два элемента DataGrid, Splitter и вставим в новую форму. Пространство имен, строки connectionString и commandText будут в точности такие же, как и в предыдущем проекте, - просто скопируйте их. Конструктор формы будет иметь следующий вид:
public Form1() { InitializeComponent(); // Создаем объект dtTourists для таблицы "Туристы" DataTable dtTourists = new DataTable("Туристы"); DataColumn dcTouristID = new DataColumn("Код туриста", typeof(int)); dcTouristID.Unique = true; DataColumn dcLastName = new DataColumn("Фамилия",typeof(string)); DataColumn dcFirstName = new DataColumn("Имя", typeof(string)); DataColumn dcMiddleName = new DataColumn("Отчество", typeof(string)); dtTourists.Columns.AddRange(new DataColumn[] { dcTouristID, dcLastName, dcFirstName, dcMiddleName }); // Создаем объект dtInfoTourists для таблицы "Информация о туристах" DataTable dtInfoTourists = new DataTable("Информация о туристах"); DataColumn dcInfoTouristsID = new DataColumn("Код туриста", typeof(int)); dcInfoTouristsID.Unique = true; DataColumn dcPassport = new DataColumn("Серия паспорта", typeof(string)); DataColumn dcCity = new DataColumn("Город", typeof(string)); DataColumn dcCountry = new DataColumn("Страна", typeof(string)); DataColumn dcPhone = new DataColumn("Телефон", typeof(decimal)); DataColumn dcIndex = new DataColumn("Индекс", typeof(decimal)); dtInfoTourists.Columns.AddRange(new DataColumn[] { dcInfoTouristsID, dcPassport, dcCity, dcCountry, dcPhone, dcIndex }); DataSet dsTourists = new DataSet(); // Добавляем таблицы в DataSet dsTourists.Tables.AddRange(new DataTable[] { dtTourists, dtInfoTourists}); // Создаем отношение между таблицами dsTourists.Relations.Add(new DataRelation("Дополнительная_информация", dcTouristID, dcInfoTouristsID)); //Подключаемся к базе и выводим данные OleDbConnection conn = new OleDbConnection(connectionString); OleDbCommand myCommand = new OleDbCommand(); myCommand.Connection = conn; myCommand.CommandText = commandText; OleDbDataAdapter dataAdapter = new OleDbDataAdapter(); dataAdapter.SelectCommand = myCommand; OleDbCommand myCommand2 = new OleDbCommand(); myCommand2.Connection = conn; myCommand2.CommandText = commandText2; OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter(); dataAdapter2.SelectCommand = myCommand2; dataAdapter.Fill(dsTourists.Tables["Туристы"]); dataAdapter2.Fill(dsTourists.Tables["Информация о туристах"]); dgTourists.DataSource = dsTourists; dgTourists.DataMember = "Туристы"; dgInfoTourists.DataSource = dsTourists; dgInfoTourists.DataMember = "Туристы.Дополнительная_информация"; }
Запускаем приложение - его функциональность должна быть в точности такая же, как и в проекте Visual2DataGrid2Table.
В программном обеспечении к курсу вы найдете приложение Programm2 DataGrid2Table (Code\Glava4\ Programm2DataGrid2Table).