Как вывести данные в datagridview c
Перейти к содержимому

Как вывести данные в datagridview c

  • автор:

Отображение данных с помощью элемента управления DataGridView в Windows Forms

Элемент управления DataGridView используется для отображения данных из различных внешних источников данных. Кроме того, можно добавить строки и столбцы в элемент управления и вручную заполнить их данными.

При привязке элемента управления к источнику данных можно автоматически создавать столбцы на основе схемы источника данных. Если эти столбцы не отображаются так как нужно, можно скрыть, удалить или изменить их порядок. Кроме того, можно добавить несвязанные столбцы для отображения дополнительных данных, которые не поступают из источника данных.

Кроме того, можно отобразить данные с помощью стандартных форматов (например, формат валюты) или настроить форматирование отображения данных так, как вам необходимо (например, изменить цвет фона для отрицательных чисел или заменить строковые значения соответствующими изображениями).

В этом разделе

Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms
Описание заполнения элемента управления данными путем привязки его к BindingSource , содержащему сведения, полученные из базы данных.

Практическое руководство. Изменение порядка столбцов элемента управления DataGridView в Windows Forms
Описание того, как изменить порядок столбцов, созданных автоматически из привязанного источника данных.

Практическое руководство. Связывание объектов с элементами управления DataGridView в Windows Forms
Описание того, как привязать элемент управления к коллекции произвольных объектов, чтобы каждый объект отображался в отдельной строке.

Практическое руководство. Доступ к связанным объектам в строках DataGridView в Windows Forms
Описание того, как получить объект, привязанный к определенной строке элемента управления.

Пример. Создание главного и подчиненного представлений данных с использованием двух элементов управления DataGridView в Windows Forms
Описание отображения данных из двух связанных таблиц базы данных, чтобы значения, отображаемые в одном элементе управления DataGridView , зависели от выбранной строки в другом элементе управления.

Ссылка

DataGridView
Справочная документация по элементу управления DataGridView.

DataGridView.DataSource
Приводится справочная документация по свойству DataSource.

BindingSource
Содержит справочную документацию по компоненту BindingSource.

Связанные разделы

Ввод данных с помощью элемента управления DataGridView в Windows Forms
Разделы, в которых описывается изменение способов добавления и изменения данных в элементе управления.

См. также

  • Элемент управления DataGridView
  • Типы столбцов элемента управления DataGridView в Windows Forms

Совместная работа с нами на GitHub

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

DataGridView управление базой данных

Приложение управления базой данных

Под управлением базой данных в приложении понимается редактирование, вставка и удаления строк. Прилагаемое приложение позволяет редактировать содержимое базы данных в режиме «Что вижу, то и получаю» (технология WYSIWYG).

Исполняющие методы-события унифицированы для редактируемых визуальных элементов DataGridView. Процедура вставки новой строки и редактирование существующей включает практически одинаковые действия. Процесс удаления строк имеет логику отмены действия. Источники данных для элементов DataGridView — это объекты типа BindingSource, которые взаимодействуют с базой данных посредством одного экземпляра DataSet.

Программный код приложения управления базой данных содержит немного добавочных строк, основная логика построена на уже заложенной в DataGridView функциональности. В приложении программно реализованы отношения между таблицами и ограничения Foreign Key, Unique.

Формирование интерфейса DataGridView

Интерфейс приложения построен на трёх элементах DataGridView. В качестве источника данных для элементов отображения таблиц в приложении применены объекты типа BindingSource. Использование класса BindingSource обеспечивает приложению взаимосвязанные манипуляции с таблицами данных.

Первый элемент DataGridView отображает таблицу Types типов продуктов. Второй элемент использует источник данных первого элемента и показывает временную таблицу выборки продуктов определенного типа. Третий элемент выводит всю таблицу продуктов Products .

В свою очередь объекты BindingSource, получают данные из базы посредством одного экземпляра DataSet. Заполнение DataSet возможно двумя способами.

Метод формирования интерфейса элементов отображения таблиц. В таблицы добавляются столбцы типа DataGridViewComboBoxColumn для отображения имени типа вместо числового идентификатора.

void BindDataSource(DataSet ds, DataGridView dgvParent, DataGridView dgvDetail, DataGridView dgvChild) < // === Создание функционального интерфейса элемента DataGridView === // Источники данных для DataGridView. BindingSource parent = new(); BindingSource detail = new(); BindingSource child = new(); // Редактируемая таблица типов, родительская для таблицы Product. parent.DataSource = ds; parent.DataMember = Constants.ParentTableName; // Заголовок с названием текущей таблицы. groupBoxParent.Text = "Таблица """ + Constants.ParentTableName + """"; // Таблица просмотра продуктов выбранного типа. detail.DataSource = parent; // Отображаем таблицу в соответствии с выбранным внешним ключом. detail.DataMember = "FK_Product_Type"; groupBoxDetail.Text = "Продукты выбранного типа"; // Редактируемая таблица Product child.DataSource = ds; child.DataMember = Constants.ChildTableName; // Связывание источников данных с элементами управления // для отображения соответствующих таблиц. dgvParent.DataSource = parent; dgvDetail.DataSource = detail; dgvChild.DataSource = child; // Видимость столбцов в завизимости от конфигурации решения. // Невидимость столбца идентификаторов. // Для удобства созданы порядковые номера в заголовках строк. // Идентификаторы внешних ключей скрываются, // остаются только названия типов. #if DEBUG == false dgvParent.Columns["Id"].Visible = false; dgvDetail.Columns["Id"].Visible = false; dgvChild.Columns["Id"].Visible = false; dgvDetail.Columns["TypeId"].Visible = false; dgvChild.Columns["TypeId"].Visible = false; #endif //===Таблица выбранного типа === // Вставка столбца НазваниеТипа в таблицу выбранного типа DataGridViewComboBoxColumn colbox2 = new(); colbox2.Name = "TypeName"; // Таким кодом активизируется связь между родительской таблицей и // дочерней для отображения в элементах DataGridView. colbox2.DataSource = parent; // Так связи не будет. // colbox.DataSource = ds.Tables["Type"]; colbox2.DisplayMember = "Name"; colbox2.ValueMember = "Id"; colbox2.DataPropertyName = "TypeId"; colbox2.DisplayIndex = 1; colbox2.FlatStyle = FlatStyle.Flat; // Если закомментировать строку ниже у ячеек DataGridViewComboBoxColumn // появится кнопка вызова списка. colbox2.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; dgvDetail.Columns.Add(colbox2); // ==== // === Таблица Product === // Отображение названия таблицы. groupBoxChild.Text = "Таблица """ + Constants.ChildTableName + """"; // Добавление способа установки типа продукта по имени. DataGridViewComboBoxColumn colbox = new(); colbox.Name = "TypeName"; // Таким кодом активизируется связь между родительской таблицей и // дочерней в текущем DataGridView. colbox.DataSource = parent; colbox.DisplayMember = "Name"; colbox.ValueMember = "Id"; colbox.DataPropertyName = "TypeId"; colbox.DisplayIndex = 1; colbox.FlatStyle = FlatStyle.Flat; colbox.SortMode = DataGridViewColumnSortMode.Automatic; // Если закомментировать строку ниже у ячеек DataGridViewComboBoxColumn // появится кнопка вызова списка. colbox.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; dgvChild.Columns.Add(colbox); // === >

Наполнение DataSet данными

В приложении есть два варианта получения данных из базы в объект DataSet. Оба способа работают одинаково, но второй позволяет немного упростить программный код.

Первый способ, классический, DataSet заполняется методом SqlDataAdapter.Fill(. ) . Таким способом объект DataSet не получает из базы свойства IDENTITY (AUTO_INCREMENT) первичных ключей, названия таблиц, значения NOT NULL и другое. Для соответствия имен таблиц исходным в базе данных дополнительно необходима карта сопоставления названий таблиц.

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

public static DataSet FillDataAdapter(string querystring, List? parameters = null) < using SqlConnection connection = new(ConnectionString); SqlDataAdapter adapter = GetAdapter(connection, querystring, parameters); DataSet dataSet = new("Catalog"); // Карта сопоставления названий таблиц набора DataSet и базы данных. adapter.TableMappings.Add("Table", Constants.ParentTableName); adapter.TableMappings.Add("Table1", Constants.ChildTableName); adapter.Fill(dataSet); return dataSet; >public static DataSet FillDataReader(string querytext, List? parameters = null) < using SqlConnection connection = new(ConnectionString); // C# 9.0 using SqlCommand command = new(querytext, connection); // C# 9.0 if (parameters != null) < foreach (SqlParameter p in parameters) < command.Parameters.Add(p); >> connection.Open(); List tables = new(); // Получаем многие данные таблиц, в т.ч. и название таблиц автоматически. // Получаем: свойства автоинкремент первичного ключа, свойства столбцов // NOT NULL и др. SqlDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo); while (reader.IsClosed == false) < DataTable table = new(); table.Load(reader); tables.Add(table); >DataSet dataSet = new DataSet("Catalog"); // Добавление таблиц в коллекцию набора. foreach (DataTable dt in tables) < dataSet.Tables.Add(dt); >return dataSet; > public static void SaveData(DataTable dt, string querystring, List? parameters = null) < using SqlConnection connection = new(ConnectionString); SqlDataAdapter adapter = GetAdapter(connection, querystring, parameters); // Для обновления передаётся таблица. // adapter.Update обновляет базу данных по таблично. // Чтобы не передавать в данный метод два параметра: // DataSet и название таблицы, передаётся один параметр DataTable // с названием таблицы внутри. int i = adapter.Update(dt); // Звук успешного обновления - для режима тестирования. #if DEBUG if (i >0) Console.Beep(3000, 100); #endif > // Метод формирует разный код в зависимости от // способа получения данных. void SetRelationConstraint(DataSet ds, bool isdataadapter) < DataTable parentTable = ds.Tables[Constants.ParentTableName]; DataTable childTable = ds.Tables[Constants.ChildTableName]; // Определение отношений между таблицами. // В базе данных эти отношения не определены. DataColumn parentColumn = parentTable.Columns["Id"]; DataColumn childColumn = childTable.Columns["TypeId"]; . . . // Код необходим только при заполнении DataSet с помощью SqlDataAdapter. // Если заполнение DataSet построить на DataTable этот код не требуется. if (isdataadapter == true) < // Установка свойства автонумерации идентификаторов. DataColumn columnId = parentColumn; columnId.AutoIncrement = true; columnId.ReadOnly = true; DataColumn columnId2 = childTable.Columns["Id"]; columnId2.AutoIncrement = true; columnId2.ReadOnly = true; // Вручную устанавливаем запрет NULL. // Если заполнение DataSet построить на DataTable эта строка не потребуется. parentTable.Columns["Name"].AllowDBNull = false; childTable.Columns["SKU"].AllowDBNull = false; >> 

Вставка новой строки

Метод события DataGridView.RowEnter() в приложении начинает процедуру создания новой строки. Данное событие генерируется в момент получения фокуса любой строкой элемента управления DataGridView. Строки в приложении могут добавляться только по одной штуке.

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

После окончания редактирования новой строки перевод фокуса на любую другую строку вызывает событие DataGridView.RowValidated() , новая строка помечается как AddedRow и далее записывается в базу данных.

Одновременно с записью новой строки из базы данных запрашивается ее идентификатор, которым перезаписывается временное значение первичного ключа. Это очень важное мероприятие: без синхронизации первичных ключей таблиц элементов DataGridView и таблиц базы данных возможно нежелательное удаление или перезаписывание важной информации.

private void RowEnter(object sender, DataGridViewCellEventArgs e) < // === Программный код участия в создании новой строки. DataGridView dgv = (DataGridView)sender; // Пока новая строка не добавлена в таблицу источника данных, // её неизвестен идентификатор. if (dgv.Rows[e.RowIndex].IsNewRow == true) < dgv.Rows[e.RowIndex].Cells["Id"].Value = "-1"; >> private void RowValidated(object sender, DataGridViewCellEventArgs e) < // Запись изменений в базу данных. Запросы UPDATE, INSERT, // исключая DELETE. DataGridView dgv = (DataGridView)sender; BindingSource bs = (BindingSource)dgv.DataSource; // Получение ссылки на редактируемую часть источника данных. DataSet ds = (DataSet)bs.DataSource; string tablename = bs.DataMember; // Сохранение в базу данных изменений и вставок строк. SaveModifications(ds, tablename); // Погашение текста и иконки ошибок связанных с ячейками. foreach (DataGridViewCell cell in dgv.Rows[e.RowIndex].Cells) < cell.ErrorText = null; >> // Логика записи UPDATE, INSERT в базу данных. void SaveModifications(DataSet ds, string tablename) < DataTable? dt = ds.Tables[tablename]; if (dt != null && ds.HasChanges() == true) < if (ds.HasChanges(DataRowState.Added) == true) InsertRow(dt); if (ds.HasChanges(DataRowState.Modified) == true) UpdateRow(dt); >> // Метод записи SQL запроса INSERT в базу данных. void InsertRow(DataTable dt) < string tablename = dt.TableName; // Получаем ссылку на новую строку. DataRow? row = dt.AsEnumerable().FirstOrDefault(r =>r.RowState == DataRowState.Added); if (row == null) return; List parameters = new(); List listnames = new(); List listvalues = new(); // Формирование списков имен и значений столбцов. int count = 0; foreach (DataColumn col in row.Table.Columns) < // В столбец со свойством идентификатора IDENTITY // значения записывать нельзя. if (col.AutoIncrement == false) < listnames.Add("[" + col.ColumnName + "]"); SqlParameter parUri = new() < // Конвертирует в необходимый тип автоматически, // без явного указания типа. //DbType = , Direction = ParameterDirection.Input, ParameterName = "Param" + count, Value = row[col.ColumnName] >; parameters.Add(parUri); count++; listvalues.Add("@" + parUri.ParameterName); > > string names = string.Join(',', listnames); string values = string.Join(',', listvalues); // Ожидаемый идентификатор вставленной строки. SqlParameter lastId = new() < Direction = ParameterDirection.Output, ParameterName = "Identity", Size = 8 >; parameters.Add(lastId); // Одновременно со вставкой строки получаем ее идентификатор // с целью синхронизации ключей элемента DataGridView и базы данных. string queryString = "INSERT INTO " + tablename + " (" + names + ") VALUES(" + values + ");"; // Функция IDENT_CURRENT( 'table_or_view' ) возвращает // последнее значение идентификатора для указанной таблицы. queryString += "SET @Identity = IDENT_CURRENT('" + tablename + "');"; //queryString += "SELECT @Identity=IDENT_CURRENT ('Product');"; ConnectDatabase.SaveData(dt, queryString, parameters); // Идентификатор новой строки получает актуальное значение. dt.Columns["Id"]!.ReadOnly = false; row["Id"] = lastId.Value; dt.Columns["Id"]!.ReadOnly = true; // Принятие изменений после присвоения настоящего идентификатора строки. // иначе логика SqlDataAdapter.Update() будет думать что это модификация строки и // без необходимости перезапишет эту строку в базе данных. row.AcceptChanges(); > 

Редактирование строки

Логическая процедура похожа на последовательность вставки строки: получение фокуса строки — событие RowEnter() , редактирование ячеек, перевод фокуса — событие RowValidated() .

Редактирование строк заключается в изменении значений заполненных ячеек или добавлении значений в пустые ячейки таблиц элемента управления DataGridView.

После окончания редактирования строки переводом фокуса вызывается событие DataGridView.RowValidated(), отредактированная строка помечается как ModifiedRow и сохраняется в базу данных.

Метод записи изменённых и новых значений строки в базу данных, выполнение SQL запроса UPDATE . Программный код методов событий смотрите выше.

void UpdateRow(DataTable dt) < string tablename = dt.TableName; // Получение ссылки на изменённую строку. DataRow? row = dt.AsEnumerable().FirstOrDefault(r =>r.RowState == DataRowState.Modified); if (row == null) return; List parameters = new(); List listnamesvalues = new(); object int count = 0; foreach (DataColumn col in row.Table.Columns) < string columnname = col.ColumnName; object value = row[col.ColumnName]; // Идентификатор нельзя перезаписывать. if (col.AutoIncrement == false) < SqlParameter parUri = new() < // Конвертирует в необходимый тип автоматически, // без явного указания типа. //DbType = , Direction = ParameterDirection.Input, ParameterName = "Param" + count, Value = row[col.ColumnName] >; parameters.Add(parUri); count++; // Полуфабрикат [имя]=значение. для строки запроса. listnamesvalues.Add("[" + col.ColumnName + "]=@" + parUri.ParameterName); > > // Идентификатор модифицированной строки // передаётся посредством параметра. SqlParameter < Direction = ParameterDirection.Input, ParameterName = "Identity", Value = id >; parameters.Add(Id); string namesvalues = string.Join(',', listnamesvalues); string queryString = "UPDATE " + tablename + " SET " + namesvalues + " WHERE ConnectDatabase.SaveData(dt, queryString, parameters); > 

Удаление строк

Чтобы удалить строки из базы, необходимо их выделить и нажать клавишу DELETE. Программная последовательность удаления строк включает три события:

DataGridView.KeyDown() – обеспечивает диалоговый интерфейс подтверждения или отмены процедуры удаления строк.

DataGridView.UserDeletingRow() – программная логика отмены процедуры удаления строк.

DataGridView.RowsRemoved() – удаляемые строки уже помечены как DeletedRow и передаются в метод удаления из базы данных.

private void DGVKeyDown(object sender, KeyEventArgs e) < // === Интерфейс диалога удаления и отмены удаления строк === DataGridView dgv = (DataGridView)sender; BindingSource bs = (BindingSource)dgv.DataSource; DataSet ds = (DataSet)bs.DataSource; string tablename = bs.DataMember; if (e.KeyCode == Keys.Delete) < if (ds != null) < int numberrowsdelete = dgv.SelectedRows.Count; DataTable? dt = ds.Tables[tablename]; if (dt != null) < // Внешний флаг удаления строк для переноса решения в другой метод. // По умолчанию запрещаем удаление строк. _deleteRows = false; if (MessageBox.Show( "Удалить строки? Количество - " + numberrowsdelete, "Удаление строк!", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes) < // Удаление разрешено. _deleteRows = true; >> > > . . . > private void UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) < // === Логика отмены удаления строк === // true - отмена действия, false - продолжения действия. e.Cancel = !_deleteRows; >private void RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e) < // === Непосредственное удаление строк === DataGridView dgv = (DataGridView)sender; BindingSource bs = (BindingSource)dgv.DataSource; DataSet ds = (DataSet)bs.DataSource; string tablename = bs.DataMember; DataTable? dt = ds.Tables[tablename]; if (dt != null) < DeleteRows(dt); >> void DeleteRows(DataTable dt) < string tablename = dt.TableName; // Получение строк помеченных для удаления. DataRow? row = dt.AsEnumerable().FirstOrDefault(r =>r.RowState == DataRowState.Deleted); if (row != null) < // Получение идентификатора удаленной строки. string? DataRowVersion.Original].ToString(); if (id == null) return; // Удаляем строку из базы по её идентификатору. string queryString = "DELETE FROM " + tablename + " WHERE ;"; ConnectDatabase.SaveData(dt, queryString); >> 

Порядковые номера строк

Первичные ключи таблиц базы данных имеют свойство IDENTITY (для MySQL AUTO_INCREMENT) и равными шагами увеличиваются после вставки новой строки. Но равномерность нарушается при удалении строк и для пользователей не очень логично выглядят такие значения.

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

В таблице элемента DataGridView, связанным с источником данных, изменить значения в заголовках строк можно только после завершения привязки. Поэтому вычисление и вставка номеров происходит в событии DataGridView.DataBindingComplete() .

private void DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) < // Это событие возникает при подключении источника данных и // при изменении его содержимого. // При элементе DataGridView связанным с источником данных, // изменить значения в заголовках строк можно // только после завершения привязки. DataGridView dgv = (DataGridView)sender; foreach (DataGridViewRow row in dgv.Rows) < // Порядковый номер не ставится в новой строке, ещё не добавленной в источник данных. if (row.IsNewRow == false) row.HeaderCell.Value = (row.Index + 1).ToString(); >> 

Оповещение о несохраненных данных

При изменениях в ячейках редактируемой строки таблиц возникает событие DataGridView.CellValueChanged(). В теле метода данного события отредактированные, но не сохраненные ячейки помечаются иконкой с выплывающей подсказкой. Такое состояние может возникать в случаях редактирования пользователем нескольких ячеек одной строки, без потери фокуса строкой. Как только редактируемая строка потеряет фокус, несохранённые значения запишутся в базу данных (см. выше), а иконки оповещения исчезнут.

Программная логика оповещения о несохраненных изменениях:

private void CellValueChanged(object sender, DataGridViewCellEventArgs e) < // Заголовки строк не редактируются. if (e.ColumnIndex >= 0) < DataGridView dgv = (DataGridView)sender; // Не предназначено для новых строк (которые внизу) элемента DataGridView. if (dgv.Rows[e.RowIndex].IsNewRow == false) < // Оповещение пользователя о несохраненных значениях в ячейках. dgv.Rows[e.RowIndex]. Cells[e.ColumnIndex].ErrorText = "Есть несохраненные изменения!"; >> > private void RowValidated(object sender, DataGridViewCellEventArgs e) < . . . // Погашение текста и иконки ошибок связанных с ячейками. foreach (DataGridViewCell cell in dgv.Rows[e.RowIndex].Cells) < cell.ErrorText = null; >> 

Оповещение об ошибках

Ошибки, возникающие в процессе редактирования таблиц DataGridView предупреждаются событием DataGridView.DataError() . В методе размещается простейший код диалогового оповещения для выбора дальнейших действий пользователем. Событие подключено ко всем редактируемым элементам DataGridView, вычисления владельца происходит по параметру sender.

private void DataError(object sender, DataGridViewDataErrorEventArgs e) < DataGridView dgv = (DataGridView)sender; BindingSource bs = (BindingSource)dgv.DataSource; string tablename = bs.DataMember; // Если нажать кнопку Ок ошибочное значение можно изменить, // нажатие на кнопку Отмена(Cancel) возвращает предыдущее // корректное значение. if (MessageBox.Show("Таблица " + tablename + " Ошибка: ячейка " + e.RowIndex + "x" + e.ColumnIndex + " " + e.Exception.Message, "Внимание", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) < e.Cancel = true; >> 

Исходник приложения управления базой данных

Исходник написан на языке C#, среда программирования MS Visual Studio 2022, .NET 6. В решении приложения находится скрипт для создания базы данных. Скрипт можно также скачать на странице Relations Tables в DataSet.

Скачать исходник

Тема: «DataGridView управление базой данных»

SQL Server

Виртуальный хостинг PHP
  • PHP 4, 5, 7, 8
  • Последние версии PHP по мере их выхода
  • Сервер на основе Apache
  • Конфигурирование PHP через .htaccess
  • Бесплатный тестовый период — 10 дней

Создание сайтов, написание приложений, программ, скриптов C++, C#, F#, PHP, JavaScript

C#. Windows Forms. Вывод таблицы базы данных Microsoft Access в компоненте dataGridView

Вывод таблицы базы данных Microsoft Access в компоненте dataGridView

Поиск на других ресурсах:

Условие задачи

Пусть имеется база данных, созданная в приложении Microsoft Access .

Имя файла базы данных mydb.mdb”. Файл размещается на диске по следующему пути:

C:\Programs\C_Sharp\WindowsFormsApplication1\mydb.mdb

База данных имеет несколько таблиц, одна из которых имеет название “ Order ”.

Задача состоит в том, чтобы с помощью средств языка C# осуществить подключение к базе данных и вывести таблицу с именем « Order » на форму.

Приложение реализовать как Windows Forms Application .

Общий вид таблиц и связей между ними изображен на рисунке 1.

Microsoft Access схема базы данных

Рис. 1. Связи между таблицами базы данных

Выполнение

1. Создание приложения.

Загружаем MS Visual Studio . Подробный пример создания приложения по шаблону Windows Forms описывается здесь .

Исходный код формы приложения имеет вид (файл Form1.cs ):

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 < public partial class Form1 : Form < public Form1() < InitializeComponent(); >> >

Как видно из листинга, в пространстве имен WindowsFormsApplication1 есть только конструктор формы, в котором вызывается метод InitializeComponent() .

2. Подключение к базе данных. Чтение строки подключения Connection String .

В итоге получаем строку подключения к базе данных Connection String. Эта строка в дальнейшем будет использована в нашем приложении.

Чтобы получить корректную строку подключения к базе данных, нужно выделить базу данных в панели Server Explorer ( mydb.mdb ) и в окне “ Properties ” прочитать (скопировать) значение свойства “ Connection String ” (рис. 2, красное выделение). Следует учесть, что слеш ‘ \ ’ в строке на C# нужно заменить на ‘ \\ ’ (два слеша) согласно синтаксису языка.

Visual Studio свойство Connection String

Рис. 2. Чтение свойства Connection String

3. Размещение компонента типа dataGridView .

Выносим на форму компонент dataGridView (рис. 3), представляющий компонент-таблицу, в которой будет выведена наша таблица “ Order ” из базы данных. Получаем объект-переменную под названием dataGridView .

Visual Studio Компонент DataGridView на панели Toolbox

Рис. 3. Компонент DataGridView на панели Toolbox

Размещение компонента dataGridView на форме изображено на рисунке 4.

Visual Studio Компонент dataGridView

Рис. 4. Компонент dataGridView на главной форме приложения

4. Изменение программного кода.
4.1. Добавление переменных SQL -запроса и строки подключения к базе данных.

Активируем текст модуля Form1.cs (главная форма) с помощью Solution Explorer . В программный код формы вводим дополнительные переменные CmdText и ConnString .

Переменная CmdText будет содержать строку SQL-запроса для вывода всех записей таблицы “Order”. Переменная ConnString представляет собой строку подключения к базе данных (см. п. 2).

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

public partial class Form1 : Form < public string CmdText = "SELECT * FROM [Order]"; public string ConnString = "Provider=Microsoft.Jet.OLEDB.4.0; DataSource=C:\\Programs\\C_Sharp\\WindowsFormsApplication1\\mydb.mdb"; public Form1() < InitializeComponent(); >>

4.2. Подключение пространства имен OleDb .

В Microsoft Visual Studio взаимодействие с файлом данных Microsoft Access осуществляется с помощью поставщика данных OLE DB или ODBC . Поставщик данных OLE DB обеспечивает доступ к данным, находящимся в любом хранилище данных, если оно поддерживает классический протокол OLE DB на основе технологии COM. Этот поставщик состоит из типов, которые определены в пространстве имен System.Data.OleDb .

В последующих шагах мы будем использовать методы из этого пространства имен. Поэтому, вначале файла Form1.cs после строки

using System.Windows.Forms;

нужно добавить строку подключения пространства имен OleDb :

using System.Data.OleDb;

4.3. Создание объекта типа OleDbDataAdapter .

В конструкторе формы после вызова

InitializeComponent();

Добавляем строку создания объекта типа OleDbDataAdapter:

OleDbDataAdapter dA = new OleDbDataAdapter(CmdText, ConnString);

Объект типа OleDbDataAdapter организовывает пересылку наборов данных с вызываемым процессом. Адаптеры данных содержат набор из четырех внутренних объектов команд. Это команды чтения, вставки, изменения и удаления информации. Как видно из программного кода, конструктор объекта получает входящими параметрами строку запроса на языке SQL (переменная CmdText ) и строку подключения к базе данных (переменная ConnString ). Таким образом, после выполнения данного кода, объект адаптера уже связан с нашей базой данных.

4.4. Создание объекта набора данных DataSet .

После создания адаптера данных ( OleDbDataAdapter ) создаем объект типа DataSet (набор данных):

DataSet ds = new DataSet();

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

4.5. Заполнение таблицы “ Order ” на основе SQL -запроса.

Следующая команда – это заполнение набора данных (переменная ds ) значениями записей из базы данных на основе SQL -запроса, содержащегося в адаптере данных dA с помощью метода Fill() :

dA.Fill(ds, "[Order]");

4.6. Визуализация данных в dataGridView1 .

На данный момент данные из таблицы “Order” считаны в объекте ds (типа DataSet), представляющем собой набор данных.

Для их отображения необходимо чтобы свойство DataSource компонента dataGridView1 ссылалось на первую таблицу (в нашем случае одна таблица) набора данных ds. Программный код этой операции имеет следующую реализацию:

dataGridView1.DataSource = ds.Tables[0].DefaultView;

После этого данные из таблицы “Order” отобразятся на форме (рис. 5).

5. Весь програмний код.

Общий листинг класса главной формы приложения имеет следующий вид:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.OleDb; namespace WindowsFormsApplication1 < public partial class Form1 : Form < public string CmdText = "SELECT * FROM [Order]"; public string ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\\Programs\\C_Sharp\\WindowsFormsApplication1\\mydb.mdb"; public Form1() < InitializeComponent(); OleDbDataAdapter dataAdapter = new OleDbDataAdapter(CmdText, ConnString); // создаем объект DataSet DataSet ds = new DataSet(); // заполняем таблицу Order // данными из базы данных dataAdapter.Fill(ds, "[Order]"); dataGridView1.DataSource = ds.Tables[0].DefaultView; > > >

Результат выполнения приложения изображен на рис. 5.

MS Visual Studio выполнение приложения форма

Рис. 5. Результат выполнения приложения

6. Схема взаимодействия.

Общая схема взаимодействия между объектами изображена на рис. 6.

Microsoft Access схема взаимодействия база данных

Рис. 6. Схема взаимодействия между объектами для доступа к базе данных

Таким образом, можно выводить на форму любую таблицу базы данных. Условия выведения данных из базы данных задаются в строке SQL -запроса в переменной CmdText.

Например, если в CmdText задать следующую строку:

CmdText = "SELECT * FROM [Order] WHERE [NameOfSender] LIKE 'І%'";

то в результате из базы данных будут извлекаться записи, начинающиеся с символа ‘ I ’.

Связанные темы
  • Подключение к базе данных Microsoft Access в MS Visual Studio
  • Разработка приложения автоматизации диспетчера касс автовокзала
  • Перевод базы данных Microsoft Access в формат MS SQL Server
  • Пример разработки программы демонстрации основных операций над данными таблицы базы данных MS SQL Server .

Программирование на C, C# и Java

Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы

ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode

Вывод данных в DataGridView из БД на C#

В Windows Forms табличные данные удобно выводить с помощью элемента управления DataGridView. В статье покажем, как это сделать на примере таблицы из базы данных и языка программирования C#.

Исходные данные для DataGridView

Имеется таблица в базе данных Microsoft SQL Server с информацией о факультетах университета.

Данные для DataGridView

Эти данные будем выводить в элемент DataGridView, расположенный на Windows Forms.

Программа с DataGridView

Создадим новый проект Windows Forms на Visual C# в Visual Studio. На форме расположим элемент управления DataGridView — для этого перетащите его с «Панели элементов» на макет окна.

Добавим в DataGridView три столбца под три соответствующих колонки из таблицы БД с помощью кнопки «Правка столбцов».

Добавление столбцов в DataGridView

Для наглядности назовём их так же, как называются поля в таблице базы данных.

Форма с DataGridView

Переходим к написанию кода. Вся функциональность по чтению данных из БД и их последующему выводу в DataGridView реализована в методе LoadData().

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *