Отображать данные master-detail в DataGrid в C#
Во время разработки я добавил проект Database.mdb в проект, установил его свойство «Build Action» в «Содержимое» и установил его свойство «Копировать в выходной каталог» в «Копировать, если новый». Таким образом, база данных копируется в исполняемый каталог, поэтому программе легко найти его во время выполнения.
При запуске программы он выполняет следующий код для загрузки данных.
// Адаптеры данных для загрузки данных. private OleDbDataAdapter DaAddresses, DaTestScores; // DataSet для хранения данных. private DataSet StudentDataSet; // Загружаем данные. private void Form1_Load(object sender, EventArgs e) { // Составьте строку подключения. string connect_string = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=Contacts.mdb;" + "Mode=Share Deny None"; // Создаем DataAdapter для загрузки таблицы адресов. DaAddresses = new OleDbDataAdapter( "SELECT * FROM Addresses", connect_string); // Создаем DataAdapter для загрузки таблицы адресов. DaTestScores = new OleDbDataAdapter( "SELECT * FROM TestScores", connect_string); // Создаем и заполняем DataSet. StudentDataSet = new DataSet(); DaAddresses.Fill(StudentDataSet, "Addresses"); DaTestScores.Fill(StudentDataSet, "TestScores"); // Определите взаимосвязь между таблицами. DataRelation data_relation = new DataRelation( "Addresses_TestScores", StudentDataSet.Tables["Addresses"].Columns["ContactID"], StudentDataSet.Tables["TestScores"].Columns["ContactID"]); StudentDataSet.Relations.Add(data_relation); // Свяжите DataGrid с DataSet. dgContacts.DataSource = StudentDataSet; }
Этот код сначала объявляет два объекта OleDbDataAdapter для загрузки данных из таблиц Адреса и TestScores базы данных. Он также объявляет DataSet для хранения данных, когда он загружен в память.
Обработчик события Load формы загружает данные. Сначала он определяет строку подключения для подключения к базе данных. Затем он использует его для создания двух адаптеров данных. Их конструкторы принимают в качестве параметров SQL-запросы, используемые для получения данных и строки подключения.
Далее код создает новый DataSet и использует адаптеры данных для копирования данных из базы данных в DataSet. Строки Адреса и TestScores указывают имена таблиц, которые адаптеры данных должны указывать на данные внутри DataSet.
Затем программа определяет отношение master-detail (или parent / child) между двумя таблицами в DataSet. Первый параметр конструктора - это имя, которое должно иметь отношение. Другие два параметра дают столбцы в основных и подробных таблицах, которые должны быть связаны. После создания отношения код добавляет его в коллекцию DataSet Relations.
Затем программа определяет отношение master-detail (или parent / child) между двумя таблицами в DataSet. Первый параметр конструктора - это имя, которое должно иметь отношение. Другие два параметра дают столбцы в основных и подробных таблицах, которые должны быть связаны. После создания отношения код добавляет его в коллекцию DataSet Relations.
...
DataGrid на самом деле довольно умный элемент управления. Сначала он отображает две таблицы DataSet. Вы можете нажать на один, чтобы развернуть его. На картинке вверху этого сообщения DataGrid отображается таблица Addresses. Связь позволяет управляющему знать, что это основная запись, поэтому она отображает знак + рядом с каждой записью. Если вы нажмете знак «+», элемент управления отобразит ссылку на соответствующие записи этой записи в дочерней таблице TestScores. Нажмите эту ссылку, чтобы просмотреть эти записи.
Маленькие изображения в верхнем правом углу элемента управления DataGrid позволяют перемещаться по DataSet. Элемент DataGrid также позволяет редактировать данные.
Когда программа заканчивается, для сохранения изменений в данных используется следующий код.
// Сохранение изменений в данных. private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // Используйте CommandBuilder для создания INSERT, // UPDATE и DELETE при необходимости. OleDbCommandBuilder cb_addresses = new OleDbCommandBuilder(DaAddresses); OleDbCommandBuilder cb_testscores = new OleDbCommandBuilder(DaTestScores); // Обновление базы данных. try { DaAddresses.Update(StudentDataSet, "Addresses"); DaTestScores.Update(StudentDataSet, "TestScores"); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
Этот код сначала создает два объекта OleDbCommandBuilder, по одному для каждой таблицы. Эти объекты автоматически генерируют инструкции SQL INSERT, UPDATE и DELETE для сохранения изменений данных. Команды связаны с DataAdapters, переданными в конструкторы сборщиков.
Этот код сначала создает два объекта OleDbCommandBuilder, по одному для каждой таблицы. Эти объекты автоматически генерируют инструкции SQL INSERT, UPDATE и DELETE для сохранения изменений данных. Команды связаны с DataAdapters, переданными в конструкторы сборщиков.
...