Как заполнить datagridview c из sql
Перейти к содержимому

Как заполнить datagridview c из sql

  • автор:

How to bind a DataGridView to a SQLite Database?

I’m trying to add a data connection to a datagridview that uses SQLite. I’ve added the reference to SQLite (downloaded the required files) but when I go through the wizard to add a data source, SQLite is not included in the choices — see screenshot below: Change Data Source I’ve looked around for answers to this question but have not been successful in finding any. Here is a screenshot of the database inside my project folder: project folder Is there any way to bind the datagridview to a sqlite data source? Any help would be appreciated. Thanks!

38.6k 28 28 gold badges 167 167 silver badges 217 217 bronze badges
asked Oct 17, 2017 at 20:38
user2101411 user2101411
1,204 2 2 gold badges 14 14 silver badges 36 36 bronze badges

3 Answers 3

  1. Go to Tools > Library Package Manager > Manage NuGet Packages for solution.
  2. Choose the Online section and write SQLite inside the textbox located on the upper-right corner. Push ENTER and wait for the search to be performed.
  3. Choose the first package: System.Data.SQLite (x86/x64).
  4. Once the package has been downloaded, select the project in which to install the provider and press OK.

If the data source still isn’t available after following the above steps don’t work, it may be a problem with the SQLite version — see the comment left by cmc and the linked thread, which says version 1.0.93 works but version 1.0.94 doesn’t.

answered Oct 20, 2017 at 10:26
Steve Chambers Steve Chambers
38.6k 28 28 gold badges 167 167 silver badges 217 217 bronze badges
unfortunately I can’t seem to get it to work. I’m using version 1.0.105.2 (the latest under nuget)
Oct 20, 2017 at 17:11
no, I don’t see it listed under NuGET, just 1.0.105.2
Oct 20, 2017 at 21:53

The older version needs to be downloaded manually — see the bottom post in the thread and its links to 32 bit and 64 bit versions of 1.0.93.

Oct 21, 2017 at 12:20

downloaded that and installed and added the reference but these steps (geekswithblogs.net/danielggarcia/archive/2013/12/22/…) are not working, as I don’t see the sqlite option for the entity model

Oct 21, 2017 at 12:49

Well it seems like the whole thing with SQLite and Visual Studio is a bit of a mess — the current answers to this question don’t exactly inspire confidence but might possibly get you there if you’re prepared to be fix to particular versions and put in some effort. In particular, this answer is the nearest to what’s described above.

Oct 23, 2017 at 21:42

  1. Go to Tools > Library Package Manager > Manage NuGet Packages for solution.
  2. Choose the Browse section and search for Microsoft.SqlServer.Compact
  3. Install it
  4. Click on View > Other Windows > SQLite/SQL Server Compact Toolbox will be appeared there.
  5. Click on SQLite/SQL Server Compact Toolbox and you can easily manage connection. Screenshots are attached enter image description hereenter image description here.

answered Oct 26, 2017 at 11:55
515 8 8 silver badges 22 22 bronze badges
unfortunately it does not appear (view->other windows->sqlite/sql).
Oct 26, 2017 at 17:09

The SQLite/SQL Server Compact Toolbox window comes from this Visual Studio extension marketplace.visualstudio.com/… , probably not from the NuGet packages

Nov 1, 2023 at 9:37

System.Data.SQLite ‘s website now says that its «design-time components» (which I believe power this «Data Source» feature in the Visual Studio UI) are now no longer «officially supported», and don’t work in Visual Studio 2017 and later anyway «due to changes in the Visual Studio package installation model»: https://system.data.sqlite.org/index.html/doc/trunk/www/news.wiki .

There is a separate 3rd-party «SQLite and SQL Server Compact Toolbox» Visual Studio Extension which provides a database explorer UI window and an SQLite Data Source, but I was unable to get the latter to work myself (in VS2019).

In the end I just did the binding myself somewhat manually in code. The SQLite* classes in System.Data.SQLite snap in to the same kinds of .DataSource stuff shown in this standard Winforms DataGridView binding tutorial: https://learn.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-bind-data-to-the-windows-forms-datagridview-control?view=netframeworkdesktop-4.8

using System.Data.SQLite; var dbConn = new SQLiteConnection("Data Source=" + pathToDbFile); var dataAdapter = new SQLiteDataAdapter( "SELECT * from [Table1]", dbConn ); // These can be constructed manually or created in the Designer DataGridView dataGridView1; BindingSource bindingSource1; // This binding can be done manually in constructor/on Load event, or also done via properties in the Designer dataGridView1.DataSource = bindingSource1; // Now, on form load or other event, the .Fill method of SQLiteDataAdapter // can be used just like the System.Data.SqlClient.SqlDataAdapter class // in the tutorial < // 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); > 

Программирование на 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().

Как заполнить datagridview c из sql

Populate Datagridview With MySQL Database using C#. Net

populate datagridview c# from mysql

populate datagridview c# from mysql

In this tutorial, I will teach you how to populate data in the Datagridview using MySQL Database and C#.net. This tutorial will help you enhance your knowledge about displaying the data in the Datagridview. This method will display the data that has been saved in the database from the Datagridview. See the step by step guide below.

Let’s get started:

Steps How to Populate Datagridview With MySQL Database using C#

Step 1: Create a database in the MySQL database named “productdb“.

Step 2: Create a table using the following query below.

Step 3: Insert the data using the following query below.

Step 4: Open Microsoft Visual Studio and create new windows form application.

Load Data Dtg MySQL

Step 5: Design the Form as follows.

Step 6: Go to the solution explorer and hit the “view code” to fire the code editor.

Load Data Dtg MySQL 2

Step 7: In the code editor, initialize all the MySQL classes that are needed.

Note: Add MySQL.Data.dll as your references to access mysql and include “using MySql.Data.MySqlClient;” above the namespace to access mysql library.

Step 8: Create a connection between MySQL and C#.net.

Step 9: Go back to the Form Design, double-click the button and do the following code in the click events of a button.

For all students who need a programmer for your thesis system or anyone who needs a source code in any programming language.

You can contact me @ :
Email – [email protected]
Mobile No. – 09305235027 – TNT

But if you are looking for a tutorial on how to load data in the datagridview using C# with SQL Server you can click it here.

DataGridView в паре с DataTable

Приложение редактирования SQL таблиц

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

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

  • — dgvDatabase для отображения списка таблиц базы данных;
  • — dgvTable для редактирования выбранной таблицы базы.

База данных в составе приложения

Исследуемая база данных содержит 3 различных таблицы. Для расширенного эксперимента в таблицах создано многообразие типов данных: int, float, bit, nvarchar, date. Столбцы имеют различные свойства инициализации: NULL, NOT NULL и значения по умолчанию.

Файл базы данных прикреплен к исходнику приложения. Подключение базы данных к SQL серверу можно осуществить с помощью среды программирования Visual Studio, как подключиться подробно описано на странице создание, подключение и отсоединение баз данных в Visual Studio. Подключить базу так же можно и в среде администрирования баз данных SQL Server Management Studio.

Инициализация приложения

Инициализация приложения и интерфейс обращения к базе данных практически аналогичен описанному в статье DataGridView — просмотр баз данных LocalDB. Во время инициализации приложения происходит получение списка таблиц базы с помощью представления информационной схемы INFORMATION_SCHEMA.TABLES . После запроса метаданные возвращаются в виде строк для каждой отдельной таблицы базы и отображаются в элементе dgvDatabase.

В списке таблиц ключевым является столбец с названием TABLE_NAME . При выборе пользователем любой ячейки элемента dgvDatabase считывается название таблицы из строки и данные загружаются в элемент DataGridView dgvTable для последующего редактирования. Программный код инициализации заключен в оболочку метода Init(), который вызывается в конструкторе формы.

Создание новой строки

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

В прикрепленном приложении новая строка вставляется в базу данных после редактирования любой ячейки и перевода фокуса на другие строки. При редактировании ячейки новая строка появляется в связанном источнике данных, в нашем случае в объекте DataTable. В событии DataGridView.RowValidated, возникающем при потере фокуса можно отследить создание новой строки посредством свойства DataRowState.Added связанного источника. Если проверка истинна, то значения строки записываются в базу данных. Для валидации заполнения новой строки предназначено событие DataGridView.RowValidating.

Вставка значений новой строки в событии DataGridView.RowValidated, возникающим после окончания валидации:

Получение значений по умолчанию

При создании новой строки требуются значения по умолчанию, и очень желательна их идентичность значениям в базе данных. Хотя DataColumn в составе DataTable имеет свойство DataColumn.DefaultValue, оно не заполняется при SQL запросах. Запросить из базы данных реальные значения по умолчанию столбцов не получится. Это связано с тем, что значения по умолчанию могут содержать не только величины, но и инициализирующие функции, например: GetDate(), NEW_ID(), которые определяют значения столбцов непосредственно во время вставки строки. Если запросить значения по умолчанию с помощью схемы INFORMATION_SCHEMA.COLUMNS , то результат вернется в виде строк вида «getdate()» , «new_id()» , «((0))» , («2022-01-20») и так далее.

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

Для описываемого приложения написан метод GetDefaultValues(. ) получения значений по умолчанию путем фиктивной вставки строки. Полученные default значения присваиваются соответствующим столбцам связанного источника данных DataTable. Ввод данных по умолчанию непосредственно в связанный источник освобождает от необходимости повторяющейся обработки события DefaultValuesNeeded.

  1. Запрос схемы столбцов текущей таблицы и получение свойств столбцов парно COLUMN_NAME-COLUMN_DEFAULT , исключая столбец первичного идентификатора;
  2. Фиктивная вставка строки в базу с пустыми значениями (не являющимися NULL) столбцов, исключая столбцы, у которых обнаружено значение по умолчанию;
  3. Полученные default значения последней вставленной строки присваиваются одноименным столбцам связанного источника.

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

Программный код получения значений по умолчанию из базы данных:

Редактирование ячеек DataGridView

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

Изменение значений своих ячеек элемент DataGridView сопровождает событием CellValueChanged. Редактируются ячейки, только существующие в базе, новые ячейки добавляются в базу данных во время вставки новой строки.

Валидация вводимых значений

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

Валидация введенного в ячейку значения происходит в событии DataGridView.CellValidating при потере фокуса ячейкой. В данном событии может находиться программный код оповещения пользователя о недопустимости ввода текущего значения. Если проигнорировать некорректность в этом событии, возникнет событие DataGridView.DataError, которое вернет первоначальное корректное значение.

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

Программный алгоритм валидации вводимых значений с диалоговым оповещением пользователя:

Определение типа вводимого значения

Вводимое в ячейку значение отслеживается в событии CellValidating(object sender, DataGridViewCellValidatingEventArgs e) , где свойство e.FormattedValue содержит введенное пользователем значение. e.FormattedValue имеет тип object и поэтому неизвестен конкретный тип введенного значения. Например, e.FormattedValue содержит 5544 и нет сведений строка это или число. Проверка заключается в попытке конвертировать значение пользователя в тип, который должен содержать столбец.

Тип значения ячейки получаем из свойств столбцов связанного источника данных DataTable. Проверку соответствия типа производит метод приложения TryConvert(. ) . При успешной конвертации метод возвращает true, в противном случае false.

Программный код попытки конвертирования в заказанный тип. Применение метода показано в валидация вводимых значений.

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

В приложении можно удалять одну и более выделенных строк элемента dgvTable. Для процедуры удаления используется событие DataGridView.KeyDown с отслеживанием нажатия клавиши DELETE. Используя идентификаторы строк, осуществляется SQL запрос удаления выбранных записей.

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

Метод вставки новой строки в базу данных

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

В приложении за запись новых строк отвечает метод главной формы Insert(DataTable dtSource, DataRow row) , который в качестве параметра получает новую строку. Данные новой строки записываются в SQL базу данных.

Программный код метода вставки строки в базу и синхронизации идентификаторов:

Синхронизация первичных ключей базы данных и DataGridView

В случае с автоматическим приращением (IDENTITY (AUTO_INCREMENT)), при вставке новых строк не обеспечивается идентичность первичных идентификаторов записей базы данных и строк элемента управления DataGridView, что может вызвать нежелательные последствия.

При создании новой строки, в событии dgvTable.RowEnter, ячейке идентификатора элемента dgvTable временно присваивается значение -1. Метод Insert(DataTable dtSource, DataRow row) написан так, что одновременно со вставкой строки запрашивается последний вставленный идентификатор. Далее данный идентификатор присваивается ячейке идентификатора новой строки связанного источника, таким образом обеспечивается идентичность первичных ключей.

Программный код выделения новой строки отличающимся цветом и временным идентификатором: Программный код синхронизации первичных ключей, полный код метода вставка новой строки:

Вместо заключения

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

Функциональность DataTable в паре с элементом управления DataGridView можно применять для редактирования таблиц источников данных. Простота работы с классом DataTable позволяет писать приложения обработки данных в кратчайшие сроки.

Программирование на 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().

Похожие публикации:

  1. Asc в sql что это
  2. Error 26 sql server как исправить
  3. Logical reads ms sql что это
  4. Microsoft sql server как удалить

Как заполнить datagridview c из sql

Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms

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

Visual Studio имеет обширную поддержку привязки данных к элементу управления DataGridView. Дополнительные сведения см. в статье Практическое руководство. Привязка данных к элементу управления DataGridView в Windows Forms с помощью конструктора.

Подключение элемента управления DataGridView к данным

  1. Реализуйте метод, обрабатывающий получение данных. В примере кода ниже реализован метод GetData , инициализирующий компонент SqlDataAdapter и использующий его для заполнения DataTable. Затем он привязывает DataTable к BindingSource.
  2. В обработчике событий 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, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Как заполнить datagridview c из sql

Данное руководство устарело. Актуальное руководство: по ADO.NET и работе с базами данных в .NET 6

Последнее обновление: 31.10.2015

Ранее мы рассмотрели, как удобно загружать данные в приложении Windows Forms в элемент DataGridView через DataSet. Теперь определим полнофункциональную форму, через которую мы сможем производить все стандартные CRUD операции в базе данных.

Итак, определим форму, на которой будет элемент DataGridView и три кнопки для добавления, удаления и сохранения изменений. Форма в итоге будет выглядеть примерно следующим образом:

DataSet и 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() . В итоге мы можем добавить несколько строк, удалить, изменить, и потом один раз мы нажмем на кнопку, и все изменения будут применены к базе данных.

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

Хостинг для CMS
  • CMS — система создания и управления сайтом
  • WordPress, Joomla, Drupal и другие
  • Автоматическая установка CMS
  • Домен в подарок
  • 10 дней бесплатного тестирования

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

Как заполнить datagridview c из sql

Работа с контролами в WPF приложениях немного отличается от работы в Windows.Forms. Многое похоже, но некоторые вещи сильно отличаются.

Так, вместо ID контрола используется его имя Name.

Рассмотрим простой способ заполнения. Итак, у нас есть класс SunsetTime:

public class SunsetTime < public string datestr < get; set; >public string voshod < get; set; >>

Создадим коллекцию класса SunsetTime и заполним несколькими значениями для примера:

inf.Add(new SunsetTime < voshod = "9:01:06", zahod = "16:07:38" >); inf.Add(new SunsetTime < voshod = "9:00:51", zahod = "16:08:47" >); inf.Add(new SunsetTime < voshod = "9:00:33", zahod = "16:10:00" >);

Для контрола DataGrid установим автоматическую генерацию столбцов:

dgv.AutoGenerateColumns = true;

Теперь укажем, что источником данных для контрола является коллекция inf:

Все, вот результат:

Заполнить столбцы DataGrid в WPF приложении

Заполнить столбцы DataGrid в WPF приложении

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

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