Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms
Элемент управления DataGridView поддерживает стандартную модель привязки данных Windows Forms, допускающую привязку к разнообразным источникам данных. Обычно выполняется привязка к объекту BindingSource, который управляет взаимодействием с источником данных. Компонент BindingSource может быть любым источником данных Windows Forms, что обеспечивает большую гибкость при выборе или изменении расположения данных. Дополнительные сведения об источниках данных, поддерживаемых элементом управления DataGridView, см. в разделе Общие сведения об элементе управления DataGridView.
Visual Studio имеет обширную поддержку привязки данных к элементу управления DataGridView. Дополнительные сведения см. в статье Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms с помощью конструктора.
Подключение элемента управления DataGridView к данным
- Реализуйте метод, обрабатывающий получение данных. В примере кода ниже реализован метод GetData , инициализирующий компонент SqlDataAdapter и использующий его для заполнения DataTable. Затем он привязывает DataTable к BindingSource.
- В обработчике событий Load формы привяжите элемент управления DataGridView к компоненту BindingSource и вызовите метод GetData для получения данных.
Пример
Этот полный пример кода извлекает данные из базы данных для заполнения элемента управления DataGridView в форме Windows. Форма также содержит кнопки для повторной загрузки данных и отправки изменений в базу данных.
Для этого примера требуются:
- доступ к примеру базы данных Northwind. Дополнительные сведения об установке примера базы данных Northwind см. в разделе Получение примеров баз данных для примеров кода ADO.NET;
- ссылки на сборки System, System.Windows.Forms, System.Data и System.Xml.
Чтобы выполнить сборку и запуск этого примера, вставьте код в файл кода Form1 в новом проекте Windows Forms. Сведения о сборке из командной строки C# или Visual Basic см. в разделах Сборка из командной строки с помощью csc.exe или Сборка из командной строки.
Заполните переменную connectionString в примере значениями для подключения к примеру базы данных Northwind на SQL Server. Проверка подлинности Windows, также называемая встроенной безопасностью, является более безопасным способом подключения к базе данных, чем хранение пароля в строке подключения. Дополнительные сведения о безопасности подключений см. в разделе Защита сведений о подключении.
using System; using System.Data; using System.Data.SqlClient; using System.Globalization; using System.Windows.Forms; namespace WindowsFormsApp < public partial class Form1 : Form < public Form1() < InitializeComponent(); >> > public class Form1 : Form < private DataGridView dataGridView1 = new DataGridView(); private BindingSource bindingSource1 = new BindingSource(); private SqlDataAdapter dataAdapter = new SqlDataAdapter(); private Button reloadButton = new Button(); private Button submitButton = new Button(); [STAThread()] public static void Main() < Application.Run(new Form1()); >// Initialize the form. public Form1() < dataGridView1.Dock = DockStyle.Fill; reloadButton.Text = "Reload"; submitButton.Text = "Submit"; reloadButton.Click += new EventHandler(ReloadButton_Click); submitButton.Click += new EventHandler(SubmitButton_Click); FlowLayoutPanel panel = new FlowLayoutPanel < Dock = DockStyle.Top, AutoSize = true >; panel.Controls.AddRange(new Control[] < reloadButton, submitButton >); Controls.AddRange(new Control[] < dataGridView1, panel >); Load += new EventHandler(Form1_Load); Text = "DataGridView data binding and updating demo"; > private void GetData(string selectCommand) < try < // Specify a connection string. // Replace with the SQL Server for your Northwind sample database. // Replace "Integrated Security=True" with user login information if necessary. String connectionString = "Data Source=;Initial Catalog=Northwind;" + "Integrated Security=True"; // Create a new data adapter based on the specified query. dataAdapter = new SqlDataAdapter(selectCommand, connectionString); // Create a command builder to generate SQL update, insert, and // delete commands based on selectCommand. SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); // Populate a new data table and bind it to the BindingSource. DataTable table = new DataTable < Locale = CultureInfo.InvariantCulture >; dataAdapter.Fill(table); bindingSource1.DataSource = table; // Resize the DataGridView columns to fit the newly loaded content. dataGridView1.AutoResizeColumns( DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader); > catch (SqlException) < MessageBox.Show("To run this example, replace the value of the " + "connectionString variable with a connection string that is " + "valid for your system."); >> private void Form1_Load(object sender, EventArgs e) < // Bind the DataGridView to the BindingSource // and load the data from the database. dataGridView1.DataSource = bindingSource1; GetData("select * from Customers"); >private void ReloadButton_Click(object sender, EventArgs e) < // Reload the data from the database. GetData(dataAdapter.SelectCommand.CommandText); >private void SubmitButton_Click(object sender, EventArgs e) < // Update the database with changes. dataAdapter.Update((DataTable)bindingSource1.DataSource); >>
Imports System.Data.SqlClient Imports System.Windows.Forms Public Class Form1 Inherits Form Private dataGridView1 As New DataGridView() Private bindingSource1 As New BindingSource() Private dataAdapter As New SqlDataAdapter() Private WithEvents ReloadButton As New Button() Private WithEvents SubmitButton As New Button() Public Shared Sub Main() Application.Run(New Form1()) End Sub ' Initialize the form. Public Sub New() dataGridView1.Dock = DockStyle.Fill ReloadButton.Text = "Reload" SubmitButton.Text = "Submit" Dim panel As New FlowLayoutPanel With < .Dock = DockStyle.Top, .AutoSize = True >panel.Controls.AddRange(New Control() ) Controls.AddRange(New Control() ) Text = "DataGridView data binding and updating demo" End Sub Private Sub GetData(ByVal selectCommand As String) Try ' Specify a connection string. ' Replace with the SQL Server for your Northwind sample database. ' Replace "Integrated Security=True" with user login information if necessary. Dim connectionString As String = "Data Source=;Initial Catalog=Northwind;" + "Integrated Security=True;" ' Create a new data adapter based on the specified query. dataAdapter = New SqlDataAdapter(selectCommand, connectionString) ' Create a command builder to generate SQL update, insert, and ' delete commands based on selectCommand. Dim commandBuilder As New SqlCommandBuilder(dataAdapter) ' Populate a new data table and bind it to the BindingSource. Dim table As New DataTable With < .Locale = Globalization.CultureInfo.InvariantCulture >dataAdapter.Fill(table) bindingSource1.DataSource = table ' Resize the DataGridView columns to fit the newly loaded content. dataGridView1.AutoResizeColumns( DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader) Catch ex As SqlException MessageBox.Show("To run this example, replace the value of the " + "connectionString variable with a connection string that is " + "valid for your system.") End Try End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _ Handles Me.Load ' Bind the DataGridView to the BindingSource ' and load the data from the database. dataGridView1.DataSource = bindingSource1 GetData("select * from Customers") End Sub Private Sub ReloadButton_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles ReloadButton.Click ' Reload the data from the database. GetData(dataAdapter.SelectCommand.CommandText) End Sub Private Sub SubmitButton_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles SubmitButton.Click ' Update the database with changes. dataAdapter.Update(CType(bindingSource1.DataSource, DataTable)) End Sub End Class
См. также
- DataGridView
- DataGridView.DataSource
- BindingSource
- Отображение данных в элементе управления DataGridView в Windows Forms
- Защита сведений о подключении
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Как datagrid подключить к бд
Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6
Последнее обновление: 31.10.2015
Ранее мы рассмотрели, как удобно загружать данные в приложении Windows Forms в элемент DataGridView через DataSet. Теперь определим полнофункциональную форму, через которую мы сможем производить все стандартные CRUD операции в базе данных.
Итак, определим форму, на которой будет элемент DataGridView и три кнопки для добавления, удаления и сохранения изменений. Форма в итоге будет выглядеть примерно следующим образом:

Код формы будет выглядеть следующим образом:
using System; using System.Data; using System.Windows.Forms; using System.Data.SqlClient; namespace AdoNetWinFormsApp < public partial class Form1 : Form < DataSet ds; SqlDataAdapter adapter; SqlCommandBuilder commandBuilder; string connectionString = @"Data Source=.\SQLEXPRESS;Initial Catalog=usersdb;Integrated Security=True"; string sql = "SELECT * FROM Users"; public Form1() < InitializeComponent(); dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.AllowUserToAddRows = false; using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); ds = new DataSet(); adapter.Fill(ds); dataGridView1.DataSource = ds.Tables[0]; // делаем недоступным столбец id для изменения dataGridView1.Columns["Id"].ReadOnly = true; >> // кнопка добавления private void addButton_Click(object sender, EventArgs e) < DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable ds.Tables[0].Rows.Add(row); >// кнопка удаления private void deleteButton_Click(object sender, EventArgs e) < // удаляем выделенные строки из dataGridView1 foreach(DataGridViewRow row in dataGridView1.SelectedRows) < dataGridView1.Rows.Remove(row); >> // кнопка сохранения private void saveButton_Click(object sender, EventArgs e) < using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); commandBuilder = new SqlCommandBuilder(adapter); adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; adapter.Update(ds); >> > >
Здесь для добавления объекта мы будем обращаться к хранимой процедуре sp_CreateUser, которая была добавлена в базу данных в прошлой теме.
В конструкторе данные загружаются в DataSet, первая таблица которого устанавливается в качестве источника данных для dataGridView1:
dataGridView1.DataSource = ds.Tables[0];
Также в конструкторе устанавливается полное выделение строки и запрет на ручное добавление новых строк:
dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect; dataGridView1.AllowUserToAddRows = false;
В обработчике кнопки добавления создается новая строка, которая добавляется в таблицу объекта DataSet. И так как мы ранее установили привязку к источнику данных, то автоматически новая строка также будет добавляться и в dataGridView1:
private void addButton_Click(object sender, EventArgs e) < DataRow row = ds.Tables[0].NewRow(); // добавляем новую строку в DataTable ds.Tables[0].Rows.Add(row); >
В обработчике кнопки удаления удаляются выделенные строки в dataGridView1. Опять же в силу привязки к источнику данных будет также происходить удаление и из таблицы в DataSet:
private void deleteButton_Click(object sender, EventArgs e) < foreach(DataGridViewRow row in dataGridView1.SelectedRows) < dataGridView1.Rows.Remove(row); >>
Для обновления на не нужна никакая кнопка, так как мы можем нажать на любую ячейку таблицы (кроме заблокированного для изменения столбца Id) и изменить в ней данные. Однако сами по себе добавление новой строки, удаление строк, изменение ячеек ни как автоматически не отразятся на базе данных. И чтобы бд синхронизировалась, пользователю надо будет нажать на кнопку сохранения, обработчик которой выглядит следующим образом:
private void saveButton_Click(object sender, EventArgs e) < using (SqlConnection connection = new SqlConnection(connectionString)) < connection.Open(); adapter = new SqlDataAdapter(sql, connection); commandBuilder = new SqlCommandBuilder(adapter); adapter.InsertCommand = new SqlCommand("sp_CreateUser", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.NVarChar, 50, "Name")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@age", SqlDbType.Int, 0, "Age")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; adapter.Update(ds); >>
Как в прошлой теме здесь устанавливается у адаптера команда на добавление InsertCommand и затем вызывается метод Update() . В итоге мы можем добавить несколько строк, удалить, изменить, и потом один раз мы нажмем на кнопку, и все изменения будут применены к базе данных.
Как datagrid подключить к бд
В прошлой теме была создана база данных, теперь подключимся к ней из приложения. В любом проекте WPF, как и в ряде других типов проектов для .NET, по умолчанию есть файл конфигурации, который называется app.config и который имеет следующее содержимое:
Добавим в него строку подключения к бд, изменив файл следующим образом:
Для определения всех подключений в программе в пределах узла добавляется новый узел . В этом узле определяются строки подключения с помощью элемента . Каждая строка подключения имеет название, определяемое с помощью атрибута name . В данном случае строка подключения называется «DefaultConnection». Название может быть произвольное.
Атрибут connectionString собственно хранит строку подключения. Он состоит из трех частей:
- Data Source=.\SQLEXPRESS : указывает на название сервера. По умолчанию для MS SQL Server Express используется «.\SQLEXPRESS»
- Initial Catalog=mobiledb : название базы данных. Так как база данных называется mobiledb, то соответственно здесь данное название и указываем
- Integrated Security=True : задает режим аутентификации
Так как мы будем подключаться к базе данных MS SQL Server, то соответственно мы будем использовать провайдер для SQL Server, функциональность которого заключена в пространстве имен System.Data.SqlClient.
Далее определим код графического интерфейса в xaml:
" Header="Модель" Width="120"/> " Header="Производитель" Width="125"/> " Header="Цена" Width="80"/>
Здесь определен довольно простой интерфейс: датагрид для отображения данных, и две кнопки для обновления данных в бд и для удаления. В итоге приложение будет выглядеть следующим образом:

Теперь определим код подключения и все обработчики кнопок в файле кода c#:
using System; using System.Windows; using System.Windows.Controls; using System.Data.SqlClient; using System.Data; using System.Configuration; namespace DbApp < public partial class MainWindow : Window < string connectionString; SqlDataAdapter adapter; DataTable phonesTable; public MainWindow() < InitializeComponent(); // получаем строку подключения из app.config connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; >private void Window_Loaded(object sender, RoutedEventArgs e) < string sql = "SELECT * FROM Phones"; phonesTable = new DataTable(); SqlConnection connection=null; try < connection = new SqlConnection(connectionString); SqlCommand command = new SqlCommand(sql, connection); adapter = new SqlDataAdapter(command); // установка команды на добавление для вызова хранимой процедуры adapter.InsertCommand = new SqlCommand("sp_InsertPhone", connection); adapter.InsertCommand.CommandType = CommandType.StoredProcedure; adapter.InsertCommand.Parameters.Add(new SqlParameter("@title", SqlDbType.NVarChar, 50, "Title")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@company", SqlDbType.NVarChar, 50, "Company")); adapter.InsertCommand.Parameters.Add(new SqlParameter("@price", SqlDbType.Int, 0, "Price")); SqlParameter parameter = adapter.InsertCommand.Parameters.Add("@Id", SqlDbType.Int, 0, "Id"); parameter.Direction = ParameterDirection.Output; connection.Open(); adapter.Fill(phonesTable); phonesGrid.ItemsSource = phonesTable.DefaultView; >catch(Exception ex) < MessageBox.Show(ex.Message); >finally < if(connection!=null) connection.Close(); >> private void UpdateDB() < SqlCommandBuilder comandbuilder = new SqlCommandBuilder(adapter); adapter.Update(phonesTable); >private void updateButton_Click(object sender, RoutedEventArgs e) < UpdateDB(); >private void deleteButton_Click(object sender, RoutedEventArgs e) < if (phonesGrid.SelectedItems != null) < for (int i = 0; i < phonesGrid.SelectedItems.Count; i++) < DataRowView datarowView = phonesGrid.SelectedItems[i] as DataRowView; if (datarowView != null) < DataRow dataRow = (DataRow)datarowView.Row; dataRow.Delete(); >> > UpdateDB(); > > >
Вся работа с бд производится стандартными средствами ADO.NET и прежде всего классом SqlDataAdapter. Вначале мы получаем в конструкторе строку подключения, которая определена выше в файле app.config:
connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
Чтобы задействовать эту функциональность, нам надо добавить в проект библиотеку System.Configuration.dll .
Далее в обработчике загрузки окна Window_Loaded создаем объект SqlDataAdapter:
adapter = new SqlDataAdapter(command);
В качестве команды для добавления объекта устанавливаем ссылку на хранимую процедуру:
adapter.InsertCommand = new SqlCommand("sp_InsertPhone", connection);
Получаем данные из БД и осуществляем привязку:
adapter.Fill(phonesTable); phonesGrid.ItemsSource = phonesTable.DefaultView;
За обновление отвечает метод UpdateDB() :
private void UpdateDB()
Чтобы обновить данные через SqlDataAdapter, нам нужна команда обновления, которую можно получить с помощью объекта SqlCommandBuilder. Для самого обновления вызывается метод adapter.Update() .
Причем не важно, что мы делаем в программе — добавляем, редактируем или удаляем строки. Метод adapter.Update сделает все необходимые действия. Дело в том, что при загрузке данных в объект DataTable система отслеживает состояние загруженных строк. В методе adapter.Update() состояние строк используется для генерации нужных выражений языка SQL, чтобы выполнить обновление базы данных. Более подробно про обновление с помощью адаптеров данных можно почитать здесь: Обновление БД из DataSet вручную
В обработчике кнопки обновления просто вызывается этот метод UpdateDB, а в обработчике кнопки удаления предварительно удаляются все выделенные строки.
Таким образом, мы можем вводить в DataGrid новые данные, редактировать там же уже существующие, сделать множество изменений, и после этого нажать на кнопку обновления, и все эти изменения синхронизируются с базой данных.
Причем важно отметить действие хранимой процедуры — при добавлении нового объекта данные уходят на сервер, и процедура возвращает нам id добавленной записи. Этот id играет большую роль при генерации нужного sql-выражения, если мы захотим эту запись изменить или удалить. И если бы не хранимая процедура, то нам пришлось бы после добавления данных загружать заново всю таблицу в datagrid, только чтобы у новой добавленной записи был в datagrid id. И хранимая процедура избавляет нас от этой работы.
Также здесь мы могли бы выполнять обновление данных сразу после редактирования строки. Для этого нужно задействовать событие RowEditEnding элемента DataGrid:
public MainWindow() < InitializeComponent(); connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; phonesGrid.RowEditEnding += PhonesGrid_RowEditEnding; >private void PhonesGrid_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e)
И если после окончания редактирования мы нажмем на Enter, то срабатает обработчик события RowEditEnding, который обновит базу данных.
Итак, здесь рассмотрен простейший способ работы с базой данных в WPF. Далее мы рассмотрим еще один способ, который подразумевает применение технологии Entity Framework.
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в соиальных сетях учстились случаи педложения помощи в написании прогамм от лиц, прикрвающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в псторонних группах ВК. Для связи с нами используйте исключительно эти контакт: vscoderu@yandex.ru, https://vk.com/vscode
Вывод данных в DataGridView из БД на C#
В Windows Forms табличные данные удобно выводить с помощью элемента управления DataGridView. В статье покажем, как это сделать на примере таблицы из базы данных и языка программирования C#.
Исходные данные для DataGridView
Имеется таблица в базе данных Microsoft SQL Server с информацией о факультетах университета.

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

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

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