Читать в оригинале

<< ПредыдущаяОглавлениеСледующая >>


4.4.3. Объект DataGridView

Вывод двух связанных таблиц данных в один элемент DataGridView

 

База данных Microsoft Access BDTur_firm.mdb содержит таблицу «Туристы», которая связана с другими таблицами. Было бы удобно выводить эту таблицу в элемент DataGridView вместе с другими таблицами, а также выводить связанные записи этой таблицы. Создадим новое Windows-приложение.

Разместим на форме элемент управления DataGridView, свойству Dock которого устанавливаем значение Fill. Переходим в код формы и подключаем пространство имен: using System.Data.OleDb;

В конструкторе формы создаем соединение, объект OleDbCommand, определяем для него соединение и строку CommandText:

OleDbConnection conn = new OleDbConnection(connectionString);
OleDbCommand myCommand = new OleDbCommand();
myCommand.Connection = conn;
myCommand.CommandText = commandText;

Подключаемся к файлу базы данных BDTur_firm.mdb, указываем соответствующие параметры строк connectionString и commandText:

string commandText = "SELECT [Код туриста], Фамилия, Имя, Отчество FROM Туристы";
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+
                                         @“D:\ВМИ\For ADO\BDTur_firm.mdb";
string commandText2 = "SELECT [Код туриста], [Серия паспорта], Город, Страна, Телефон, Индекс " + "FROM [Информация о туристах]";

Создаем объект DataAdapter и в его свойстве SelectCommand устанавливаем значение myCommand, открываем соединение:

OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = myCommand;
conn.Open();

Создаем объект

DataSet: DataSet ds = new DataSet();

В объекте DataSet здесь будут храниться две таблицы - главная и связанная с ней дочерняя. Поэтому воспользуемся свойством TableMappings объекта DataAdapter для занесения в него первой таблицы «Туристы»:

dataAdapter.TableMappings.Add("Table", "Туристы");
dataAdapter.Fill(ds);

Теперь нам следует добавить объекты OleDbDataAdapter и OleDbCommand для таблицы «Информация о туристах»:

OleDbCommand myCommand2 = new OleDbCommand();
myCommand2.Connection = conn;
myCommand2.CommandText = commandText2;
OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();

Обратим внимание на то, что dataAdapter2 использует то же самое подключение conn, что и dataAdapter.

Строку commandText2 определим следующим образом:

string commandText2 = "SELECT [Код туриста], [Серия паспорта], Город, Страна, Телефон, Индекс " + "FROM [Информация о туристах]";

Теперь свяжем второй объект OleDbDataAdapter с только что созданной второй командой и отобразим «Информацию о туристах» на его таблицу. Затем можно заполнить объект DataSet данными из второй таблицы:

dataAdapter2.SelectCommand = myCommand2;
dataAdapter2.TableMappings.Add("Table", "Информация о туристах");
dataAdapter2.Fill(ds);

В итоге получился объект DataSet с двумя таблицами. Теперь можно выводить одну из этих таблиц на форму, или две сразу. Но связь между таблицами еще не создана. Для конфигурирования отношения по полю «Код туриста» создадим два объекта DataColumn:

DataColumn dcTouristsID = ds.Tables["Туристы"].Columns["Код туриста"];
DataColumn dclnfoTouristsID = ds.Tables["Информация о туристах"].Columns["Код туриста"];

Далее создаем объект DataRelation, в его конструкторе передаем название отношения между таблицами и два объекта DataColumn:

DataRelation dataRelation = new DataRelation("Дополнительная информация", dcTouristsID, dclnfoTouristsID);

Добавляем созданный объект отношения к объекту DataSet:

ds.Relations.Add(dataRelation);

Создаем объект DataViewManager, отвечающий за отображение DataSet в объекте DataGrid:

DataViewManager dsview = ds.DefaultViewManager;

Присваиваем свойству DataSource объекта DataGridView созданный объект DataViewManager:

dataGrid1.DataSource = dsview;

Последнее, что осталось сделать, - сообщить объекту DataGrid, какую таблицу считать главной (родительской) и, соответственно, отображать на форме:

dataGrid1.DataMember = "Туристы";

Закрываем соединение:

conn.Close();

Полностью созданный код конструктора Form1 выглядит следующим образом:

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;
         conn.Open();
         DataSet ds = new DataSet();
         dataAdapter.TableMappings.Add("Table", "Туристы");
         dataAdapter. Fill(ds);
         OleDbCommand myCommand2 = new OleDbCommand();
         myCommand2.Connection = conn;
         myCommand2.CommandText = commandText2;
         OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
         dataAdapter2.SelectCommand = myCommand2;
         dataAdapter2.TableMappings.Add("Table", "Информация о туристах");
         dataAdapter2.Fill(ds);
         DataColumn dcTouristsID = ds.Tables["Туристы"].Columns["Код туриста"];
         DataColumn dcInfoTouristsID = ds.Tables["Информация о туристах"].Columns["Код туриста"];
         DataRelation dataRelation = new DataRelation("Дополнительная информация", dcTouristsID, dcInfoTouristsID);
         ds. Relations. Add(dataRelation);
         DataViewManager dsview = ds.DefaultViewManager;
         dataGrid1.DataSource = dsview;
         dataGrid1.DataMember = "Туристы";
         conn.Close();
}

Запускаем приложение. У каждой строки таблицы появился знак «+», говорящий о том, что у данной записи имеются дочерние записи (рис. 122).

Рис. 122. Демонстрация наличия дочерних записей

Для перехода на дочернюю запись нажимаем на «+» и нажимаем на ссылку «Дополнительная информация». Окно приложения приобретает следующий вид (рис. 123).

Рис. 123. Демонстрация дочерних записей

Для возвращения на родительскую запись нажимаем на кнопку со стрелкой. Обратите внимание, что здесь не накладываются ограничения - это сделано для упрощения кода.

Закомментируем фрагмент кода, отвечающий за создание связи. В этом случае в приложении будут отдельные ссылки на две таблицы - «Туристы» и «Информация о туристах» (рис. 124).

Рис. 124. Переход на две таблицы - «Туристы» и «Информация о туристах»

 

Вывод связанных таблиц данных в два элемента DataGridView

 

Наиболее часто встречаемая задача при разработке приложений, связанных с базами данных, - это одновременный вывод двух таблиц на форму, причем при перемещении по записям главной таблицы в дочерней автоматически отображаются связанные записи.

Добавим на форму еще один компонент DataGridView, в котором будут отображаться связанные записи.

В конструктор формы добавим следующий код:

dataGridViewl.DataSource = dsview;
dataGridViewl.DataMember = "Туристы.Дополнительная информация";

Окно запущенного приложения показано на рисунке 125.

Рис. 125. Отображение связанных данных

Ключевым моментом здесь является определение связи «Дополнительная информация»:

dataGridView1.DataMember = "Туристы.Дополнительная информация";

Эта же связь доступна и в окне родительской таблицы - при нажатии на гиперссылку возвращается связанная запись.

 



<< ПредыдущаяОглавлениеСледующая >>