Visual Studio CDataGridView: A Powerful Tool for Data Visualization
The DataGridView is a powerful tool for data visualization in Visual Studio C. It allows you to easily create and display data tables, and to perform a variety of operations on the data, such as sorting, filtering, and editing.
In this article, we will take a closer look at the DataGridView control. We will learn how to create and configure a DataGridView, how to bind data to it, and how to perform common operations on the data. We will also explore some of the advanced features of the DataGridView, such as grouping and sorting, and how to export data to a spreadsheet or CSV file.
By the end of this article, you will have a solid understanding of how to use the DataGridView to visualize and manipulate data in your Capplications.
What is the DataGridView?
The DataGridView is a control that allows you to display data in a tabular format. It is similar to the Windows Forms ListView control, but it has a number of features that make it specifically suited for data visualization.
For example, the DataGridView allows you to:
- Sort data by one or more columns.
- Filter data by criteria such as text, dates, or numbers.
- Edit data directly in the DataGridView.
- Export data to a spreadsheet or CSV file.
The DataGridView is a powerful tool that can be used to visualize and manipulate data in a variety of applications. It is easy to use and configure, and it provides a number of features that make it a valuable addition to any Cdeveloper’s toolkit.
Header 1 | Header 2 | Header 3 |
---|---|---|
Data 1 | Data 2 | Data 3 |
Data 4 | Data 5 | Data 6 |
A DataGridView is a control that allows you to display data in a tabular format. It is used to view and edit data in a Windows Forms application. It can be bound to a data source, such as a database or an array.
What is a DataGridView?
A DataGridView is a control that allows you to display data in a tabular format. It is made up of rows and columns, and each cell in the grid can contain data. The data in a DataGridView can be bound to a data source, such as a database or an array. This means that the data in the grid will automatically be updated when the data source changes.
How to create a DataGridView?
To create a DataGridView, you can drag and drop it from the Toolbox onto your form. You can also use the following code:
dataGridView1 = new DataGridView();
this.Controls.Add(dataGridView1);
Once you have created a DataGridView, you can bind it to a data source. To do this, you need to set the DataSource property of the DataGridView to the data source object. For example, if you have a DataTable object called data, you would set the DataSource property of the DataGridView to data like this:
dataGridView1.DataSource = data;
How to bind a DataGridView to a data source
Once you have created a DataGridView and bound it to a data source, you can start displaying the data in the grid. To do this, you need to set the Columns property of the DataGridView to an array of DataGridViewColumn objects. Each DataGridViewColumn object represents a column in the grid, and it specifies the data type of the data in the column, the header text for the column, and the width of the column.
For example, the following code creates a DataGridView with two columns: a column for the first name and a column for the last name.
dataGridView1.Columns.Add(new DataGridViewColumn(“First Name”));
dataGridView1.Columns.Add(new DataGridViewColumn(“Last Name”));
Once you have created the columns, you can bind the data to the grid. To do this, you need to call the DataSourceChanged event handler of the DataGridView. The DataSourceChanged event handler is called when the DataSource property of the DataGridView changes. In the DataSourceChanged event handler, you can loop through the rows in the data source and add each row to the DataGridView.
For example, the following code loops through the rows in the data source and adds each row to the DataGridView.
private void dataGridView1_DataSourceChanged(object sender, EventArgs e)
{
// Get the data source from the DataGridView.
DataTable dataSource = (DataTable)dataGridView1.DataSource;
// Loop through the rows in the data source.
foreach (DataRow row in dataSource.Rows)
{
// Add the row to the DataGridView.
dataGridView1.Rows.Add(row);
}
}
How to edit data in a DataGridView
You can edit data in a DataGridView by clicking on a cell in the grid and typing in the new value. The data in the cell will be updated in the data source.
You can also use the DataGridView’s editing features to edit data. The DataGridView has a number of editing features, such as the ability to edit cells in-place, the ability to insert and delete rows, and the ability to save and cancel changes.
How to export data from a DataGridView
You can export data from a DataGridView to a number of different formats, including CSV, XML, and HTML. To export data from a DataGridView, you can use the ExportData() method. The ExportData() method takes a string as a parameter, which specifies the format of the exported data.
For example, the following code exports the data from a DataGridView to a CSV file.
dataGridView1.ExportData(“data.csv”);
A DataGridView is a powerful control that can be used to display and edit data in a Windows Forms application. It can be bound to a data source, such as a database or an array, and it allows you to edit data in-place. You can also export data from a DataGridView to a number of different formats.
To create a DataGridView in Visual Studio, follow these steps:
1. Open Visual Studio.
2. Create a new project.
3. In the Toolbox, click the Data tab.
4. Drag and drop a DataGridView control onto your form.
5. In the Properties window, set the Name property of the DataGridView to `dataGridView1`.
6. Click the Design tab.
7. In the Data Sources window, click the Add button.
8. In the Add Data Source dialog box, select Database.
9. Click the Next button.
10. In the Choose a Data Source dialog box, select the database that you want to use.
11. Click the Next button.
12. In the Choose a Table dialog box, select the table that you want to display in the DataGridView.
13. Click the Finish button.
The DataGridView will now be populated with the data from the selected table.
How to bind a DataGridView to a data source
To bind a DataGridView to a data source, you can use the following code:
dataGridView1.DataSource = myDataSet;
Where `myDataSet` is a DataSet object that contains the data that you want to display in the DataGridView.
You can also bind a DataGridView to a data source using the DataBinding dialog box. To do this, follow these steps:
1. Right-click the DataGridView and select DataBinding.
2. In the DataBinding dialog box, select the data source that you want to bind to.
3. Click the OK button.
The DataGridView will now be bound to the selected data source.
How to customize a DataGridView
You can customize a DataGridView by changing its properties. For example, you can change the following properties:
- AutoSizeColumnsMode – This property determines how the columns in the DataGridView are sized.
- ColumnHeadersVisible – This property determines whether the column headers are visible.
- RowHeadersVisible – This property determines whether the row headers are visible.
- ShowGridLines – This property determines whether the grid lines are visible.
You can also customize the appearance of a DataGridView by changing its style. To do this, follow these steps:
1. Right-click the DataGridView and select Properties.
2. In the Properties window, click the Style property.
3. In the Style dialog box, select the style that you want to use.
The DataGridView will now be customized with the selected style.
How to filter a DataGridView
You can filter a DataGridView by using the Filter property. To do this, follow these steps:
1. Set the Filter property of the DataGridView to a string that represents the criteria that you want to use to filter the data.
2. For example, to filter the data by the value in the `FirstName` column, you would set the Filter property to the following string:
FirstName = “John”
The DataGridView will now be filtered to only show the rows that match the specified criteria.
How to sort a DataGridView
You can sort a DataGridView by using the Sort property. To do this, follow these steps:
1. Set the Sort property of the DataGridView to the column that you want to sort by.
2. Set the SortOrder property of the DataGridView to the order that you want to sort the data in.
For example, to sort the data in the `FirstName` column in ascending order, you would set the Sort property to `FirstName` and the SortOrder property to `Ascending`.
The DataGridView will now be sorted by the specified column and order.
How to add a DataGridView to a Windows Forms application
To add a DataGridView to a Windows Forms application, follow these steps:
1. In the Toolbox, click the Data tab.
2. Drag and drop a DataGridView control onto your
Q: What is a DataGridView in Visual Studio C?
A DataGridView is a control that allows you to display and edit tabular data in your Windows Forms application. It is similar to a spreadsheet, but it is specifically designed for use in Windows Forms applications.
Q: How do I create a DataGridView in Visual Studio C?
To create a DataGridView in Visual Studio C, you can follow these steps:
1. In the Toolbox, double-click the DataGridView control.
2. Drag the DataGridView control onto your form.
3. In the Properties window, set the DataSource property of the DataGridView control to the data source that you want to display.
Q: How do I add columns to a DataGridView in Visual Studio C?
To add columns to a DataGridView in Visual Studio C, you can follow these steps:
1. Right-click the DataGridView control and select Add Column.
2. In the Add Column dialog box, select the data type of the column that you want to add.
3. Enter a name for the column.
4. Click OK.
Q: How do I bind data to a DataGridView in Visual Studio C?
To bind data to a DataGridView in Visual Studio C, you can follow these steps:
1. Set the DataSource property of the DataGridView control to the data source that you want to bind to.
2. In the Properties window, set the DataMember property of the DataGridView control to the name of the data object that you want to bind to.
Q: How do I edit data in a DataGridView in Visual Studio C?
To edit data in a DataGridView in Visual Studio C, you can follow these steps:
1. Click the cell in the DataGridView control that you want to edit.
2. Type the new value for the cell.
3. Press Enter to save the changes.
Q: How do I delete data from a DataGridView in Visual Studio C?
To delete data from a DataGridView in Visual Studio C, you can follow these steps:
1. Click the row in the DataGridView control that you want to delete.
2. Press Delete.
Q: How do I sort data in a DataGridView in Visual Studio C?
To sort data in a DataGridView in Visual Studio C, you can follow these steps:
1. Click the column header that you want to sort by.
2. Click the Ascending or Descending arrow to change the sort order.
Q: How do I filter data in a DataGridView in Visual Studio C?
To filter data in a DataGridView in Visual Studio C, you can follow these steps:
1. Click the Filter button in the DataGridView control.
2. In the Filter dialog box, enter the criteria that you want to use to filter the data.
3. Click OK.
Q: How do I export data from a DataGridView in Visual Studio C?
To export data from a DataGridView in Visual Studio C, you can follow these steps:
1. Right-click the DataGridView control and select Export.
2. In the Export dialog box, select the format that you want to export the data to.
3. Click OK.
Q: How do I import data into a DataGridView in Visual Studio C?
To import data into a DataGridView in Visual Studio C, you can follow these steps:
1. Right-click the DataGridView control and select Import.
2. In the Import dialog box, select the file that you want to import the data from.
3. Click OK.
In this article, we have discussed how to use the DataGridView control in Visual Studio C. We have covered the basics of creating a DataGridView, populating it with data, and binding it to a data source. We have also seen how to customize the appearance of the DataGridView and how to perform common tasks such as sorting and filtering data.
We hope that this article has been helpful and that you have learned something new about using the DataGridView control in Visual Studio C. If you have any questions or comments, please feel free to leave them below.
Here are some key takeaways from this article:
- The DataGridView control is a powerful tool for displaying and interacting with data in a Windows Forms application.
- To create a DataGridView, you can use the DataGridView control in the Toolbox or by adding the `System.Windows.Forms.DataGridView` namespace to your project.
- To populate a DataGridView with data, you can use the `DataSource` property or the `LoadData()` method.
- To bind a DataGridView to a data source, you can use the `BindingSource` control.
- You can customize the appearance of the DataGridView by setting its properties or by using templates.
- You can perform common tasks such as sorting and filtering data by using the DataGridView’s methods and events.
Author Profile
-
Hatch, established in 2011 by Marcus Greenwood, has evolved significantly over the years. Marcus, a seasoned developer, brought a rich background in developing both B2B and consumer software for a diverse range of organizations, including hedge funds and web agencies.
Originally, Hatch was designed to seamlessly merge content management with social networking. We observed that social functionalities were often an afterthought in CMS-driven websites and set out to change that. Hatch was built to be inherently social, ensuring a fully integrated experience for users.
Now, Hatch embarks on a new chapter. While our past was rooted in bridging technical gaps and fostering open-source collaboration, our present and future are focused on unraveling mysteries and answering a myriad of questions. We have expanded our horizons to cover an extensive array of topics and inquiries, delving into the unknown and the unexplored.
Latest entries
В этой статье мы рассмотрим основные принципы работы с элементом DataGridView в приложении Windows Forms и напишем тестовую программу на языке C#, которая будет выводить в элемент DataGridView список названий книг, их авторов и год публикации книг. Подобный список мог бы использоваться в какой-то специализированной программе, например, для автоматизации работы книжной библиотеки.
Элемент DataGridView применяется для отображения данных в табличной форме с возможностью управления этими данными. Например, с его помощью можно регулировать способ выбора строк или ячеек таблицы, производить правку данных непосредственно в самом элементе DataGridView, сортировать данные в таблице и так далее.
В нашей программе мы предусмотрим и реализуем следующие возможности:
- коллекция книг будет храниться в памяти и устанавливаться в качестве источника данных для элемента DataGridView
- мы сделаем быстрый поиск по списку книг, т.е. поддержим механизм фильтрации данных в элементе DataGridView
- удаление строк из таблицы через контекстное меню, отображаемое для элемента DataGridView; будем также показывать диалог с подтверждением удаления записи
- редактирование данных о книгах и их авторах прямо в элементе управления DataGridView, а также через отдельную форму редактирования записи в таблице
- добавление новых книг в коллекцию и их отображение в элементе DataGridView
- текстовое поле с отображением внутреннего содержимого списка книг — это позволит отслеживать состояние списка книг в памяти при работе программы.
Вот так будет выглядеть наше приложение:
Приложение будет позволять редактировать элементы прямо в таблице — мы сможем изменять название книги и автора и видеть эти изменения сразу в памяти программы.
Мы также поддержим контекстное меню для элемента DataGridView, которое будет содержать два пункта меню — «Удалить выбранную книгу» и «Редактировать выбранную книгу». При нажатии на пункт меню «Удалить выбранную книгу» запись с данными о книге будет удаляться из таблицы, а также из списка книг в памяти приложения.
При нажатии на второй пункт меню «Редактировать выбранную книгу» будет отображаться отдельная форма с редактированием данных о книге:
Перед удалением книги мы будем также отображать всплывающий диалог с подтверждением этого действия:
Мы также сможем добавлять книги в список, хранящийся в памяти программы и привязанный к нашей таблице и элементу DataGridView. Для добавления новой книги будет необходимо ввести её название, автора и выбрать дату издания:
Итак, давайте приступим к созданию проекта в среде разработки Microsoft Visual Studio для нашего приложения.
Создание нового проекта в среде Microsoft Visual Studio
Откройте среду разработки Microsoft Visual Studio и создайте новый проект с типом Приложение Windows Forms (.NET Framework), как показано ниже:
В качестве имени нового проекта задайте DataGridViewSample и выберите местоположение, куда будут сохранены файлы нового проекта (здесь я обычно оставляю все настройки по умолчанию и рекомендую сделать то же самое, просто запомните каталог, указанный в поле «Расположение», чтобы затем открывать его в Проводнике).
Переименование главной формы приложения
После создания проекта будет создана главная форма по умолчанию с именем Form1 и соответствующий ей класс Form1.cs.
Выберем в окне «Обозреватель решений» эту форму и в окне «Свойства» изменим название класса для формы на FrmDataGridViewSampleMain.cs.
В диалоговом окне, запрашивающем подтверждение переименования класса формы и связанных с ней файлов, соглашаемся.
В итоге должно получиться следующее — в окне «Обозреватель решений» форма и зависящие от неё файлы будут переименованы:
А так должно выглядеть окно «Свойства»:
Настройка главной формы приложения и её элементов
Далее нам нужно изменить размеры и свойства главной формы и расположить на ней все нужные нам элементы управления.
Выберите форму, чтобы она появилась в представлении конструктора и установите для формы следующие свойства и их значения:
- FormBorderStyle — FixedSingle
- Text — [Allineed.Ru] Пример работы с элементом DataGridView
- Size — 1026; 568
- StartPosition — CenterScreen
- Name — FrmDataGridViewSampleMain
- MaximizeBox — False
- MinimizeBox — False
Теперь расположим на главной форме нужные элементы. Для этого в левой части Microsoft Visual Studio находим «Панель элементов» и последовательно перетаскиваем с неё на нашу главную форму следующие элементы, а также устанавливаем им описанные ниже свойства:
1) Один элемент ContextMenuStrip для контекстного меню, которое будет отображаться на элементе DataGridView
Перетаскиваем на форму элемент ContextMenuStrip и устанавливаем ему следующие свойства:
- Name — ContextMenuStripForGrid
Далее необходимо выбрать этот элемент ContextMenuStrip в нижней части представления конструктора формы, как показано ниже:
После этого в представлении конструктора формы появится выпадающее меню с подсказкой «Вводить здесь». Необходимо ввести с клавиатуры названия для двух новых пунктов меню:
- &Удалить выбранную книгу
- &Редактировать выбранную книгу
В результате будут созданы два соответствующих элемента ToolStripMenuItem для контекстного меню (знак & перед текстом пунктов меню позволит при работе программы использовать комбинацию клавиш Alt+<подчёркнутая_буква> для выбора пункта меню с клавиатуры без использования мыши):
Теперь снова последовательно выбираем каждый из этих элементов и устанавливаем им свойства:
Для пункта меню «&Удалить выбранную книгу»:
- Name — MenuItemRemoveBook
Для пункта меню «&Редактировать выбранную книгу»:
- Name — MenuItemEditBook
2) Один элемент DataGridView для списка книг
Перетаскиваем на форму элемент DataGridView и устанавливаем ему следующие свойства:
- CellBorderStyle — RaisedHorizontal
- ColumnHeadersDefaultCellStyle — открыть окно «Построитель CellStyle» и установить в нём для свойства Font значение: Microsoft Sans Serif; 8,25pt; style=Bold
- RowsDefaultCellStyle — открыть окно «Построитель CellStyle» и установить в нём для свойства BackColor значение PapayaWhip, а для свойства ForeColor — значение SaddleBrown
- Location — 12; 41
- Size — 587; 388
- ColumnHeadersHeightSizeMode — AutoSize
- ContextMenuStrip — ContextMenuStripForGrid
- Name — DataGridViewBooks
3) Один элемент TextBox для текстового представления списка книг в памяти программы
Перетаскиваем на форму элемент TextBox и устанавливаем ему следующие свойства:
- ScrollBars — Vertical
- Location — 605; 12
- Size — 391; 417
- Multiline — True
- ReadOnly — True
- Name — TextBoxBooks
4) Один элемент Label с текстом «Поиск:»
Перетаскиваем на форму элемент Label и устанавливаем ему следующие свойства:
- Text — Поиск:
- Location — 12; 15
- Size — 42; 13
- Name — LabelSearch
5) Один элемент TextBox для быстрого поиска книги или автора и фильтрации данных в элементе DataGridView
Перетаскиваем на форму элемент TextBox и устанавливаем ему следующие свойства:
- Text — <оставить поле пустым>
- Location — 53; 12
- Size — 546; 20
- Name — TextBoxSearch
6) Один элемент GroupBox для группировки элементов в нижней части формы
Перетаскиваем на форму элемент GroupBox и устанавливаем ему следующие свойства:
- Text — Добавить новую книгу в коллекцию:
- Location — 12; 435
- Size — 984; 59
- Name — GroupBoxAddNewBook
Теперь внутрь этого элемента GroupBox перетаскиваем дополнительные элементы и устанавливаем им свойства:
6.1) один элемент Label для названия книги
- Text — Название:
- Location — 16; 25
- Size — 60; 13
- Name — LabelTitle
6.2) один элемент TextBox для ввода названия книги
- Text — <оставить поле пустым>
- Location — 82; 22
- Size — 294; 20
- Name — TextBoxTitle
6.3) один элемент Label для автора книги
- Text — Автор:
- Location — 393; 25
- Size — 40; 13
- Name — LabelAuthor
6.4) один элемент TextBox для ввода автора книги
- Text — <оставить поле пустым>
- Location — 439; 22
- Size — 175; 20
- Name — TextBoxAuthor
6.5) один элемент Label для года издания книги
- Text — Год издания:
- Location — 630; 25
- Size — 73; 13
- Name — LabelDatePublished
6.6) один элемент DateTimePicker для ввода года издания книги
- Format — Custom
- Location — 717; 22
- Size — 66; 20
- CustomFormat — yyyy
- Name — DateTimePickerDatePublished
6.7) один элемент Button для добавления книги в таблицу
- Text — &Добавить книгу
- Location — 823; 20
- Size — 147; 23
- Name — ButtonAddBook
Дизайн для главной формы приложения готов, все необходимые элементы на ней присутствуют.
Добавление новой формы для редактирования книги
Добавьте к проекту новую форму и назовите её FrmEditBook. Для добавления новой формы в окне «Обозреватель решений» кликните на проекте DataGridViewSample правой кнопкой мыши (маркер 1 на рисунке ниже), затем выберите пункт меню «Добавить» (маркер 2 на рисунке ниже), а затем выберите пункт меню «Форма (Windows Forms)…» (маркер 3 на рисунке ниже):
В открывшемся диалоговом окне вместо имени класса по умолчанию Form1.cs введите имя нового класса для формы FrmEditBook.cs и нажмите кнопку «Добавить».
После добавления формы к проекту установите ей следующие свойства:
- FormBorderStyle — FixedSingle
- Text — Редактировать книгу
- Size — 548; 342
- StartPosition — CenterScreen
- Name — FrmEditBook
- MaximizeBox — False
- MinimizeBox — False
Далее расположите на форме следующие элементы управления и задайте им соответствующие свойства:
1) Один элемент Label (для текстового поля с названием книги):
- Text — Название книги:
- Location — 23; 20
- Size — 92; 13
- Name — LabelTitle
2) Один элемент TextBox (для отображения редактируемого названия книги):
- Text — <оставить поле пустым>
- Location — 26; 36
- Size — 476; 20
- Name — TextBoxTitle
3) Один элемент Label (для текстового поля с автором книги):
- Text — Автор книги:
- Location — 23; 81
- Size — 72; 13
- Name — LabelAuthor
4) Один элемент TextBox (для отображения редактируемого автора книги):
- Text — <оставить поле пустым>
- Location — 26; 97
- Size — 476; 20
- Name — TextBoxAuthor
5) Один элемент Label (для поля с выбором года издания книги):
- Text — Год издания:
- Location — 23; 144
- Size — 73; 13
- Name — LabelDatePublished
6) Один элемент DateTimePicker (поле с выбором года издания книги):
- Format — Custom
- Location — 26; 160
- Size — 89; 20
- CustomFormat — yyyy
- Name — DateTimePickerDatePublished
7) Один элемент Button (кнопка «OK»):
- Text — &OK
- Location — 346; 236
- Size — 75; 23
- DialogResult — OK
- Name — ButtonOK
Один элемент Button (кнопка «Отмена»):
- Text — &Отмена
- Location — 427; 236
- Size — 75; 23
- DialogResult — Cancel
- Name — ButtonCancel
Теперь все основные элементы расположены на нашей второй форме «Редактировать книгу». Для завершения дизайна формы нам осталось выставить ещё два дополнительных свойства на форме.
Выберите форму в представлении конструктора и установите свойства из категории «Прочее»:
- AcceptButton — ButtonOK
- CancelButton — ButtonCancel
Должно было получиться следующее:
Теперь дизайн второй формы полностью готов. Нажмите комбинацию Ctrl+Shift+S, чтобы сохранить все изменения в проекте.
Чуть позже мы привяжем текстовые поля формы и элемент DateTimePicker, который используется для редактирования года издания книги к источнику данных, которым будет являться экземпляр класса Book.
Создаём класс Book для хранения данных о книге
Добавим в приложение новый класс с именем Book. Он будет описывать объекты книг, которые мы будем хранить в списке в памяти нашей программы и отображать этот список в элементе DataGridView, используя его в качестве источника данных для элемента DataGridView.
Для добавления нового класса в окне «Обозреватель решений» кликните на проекте DataGridViewSample правой кнопкой мыши (маркер 1 на рисунке ниже), затем выберите пункт меню «Добавить» (маркер 2 на рисунке ниже), а затем выберите пункт меню «Класс…» (маркер 3 на рисунке ниже):
В открывшемся диалоговом окне вместо Class1.cs введите имя нового класса: Book.cs и нажмите кнопку «Добавить». В результате будет открыт редактор кода со сгенерированным начальным кодом класса Book. Всё содержимое нужно будет заменить представленным ниже кодом.
Ниже полный код класса Book, который имеет свойства для хранения названия книги (Title), автора книги (Author), а также даты публикации книги (DatePublished). Мы также отдельно будем возвращать год публикации книги (YearPublished), без возможности его редактирования:
using System;
namespace DataGridViewSample {
public class Book {
public string Title { get; set; }
public string Author { get; set; }
public DateTime DatePublished { get; set; }
public string YearPublished { get { return DatePublished.ToString("yyyy"); } }
public Book(string title, string author, DateTime datePublished) {
Title = title;
Author = author;
DatePublished = datePublished;
}
public override string ToString() {
return "\tBook@" + GetHashCode() + "{\r\n" +
"\t\tTitle: " + Title + "\r\n" +
"\t\tAuthor: " + Author + "\r\n" +
"\t\tDatePublished: " + DatePublished + "\r\n" +
"\t\tYearPublished: " + YearPublished + "\r\n" +
"\t}";
}
}
}
Вставьте весь представленный выше код в редактор и сохраните изменения, нажав Ctrl+S.
Привязка полей формы FrmEditBook к источнику данных
Теперь, когда класс книги Book у нас готов, мы привяжем текстовые поля формы редактирования книги (FrmEditBook) и её элемент DateTimePicker к источнику данных, которым будет являться экземпляр книги.
Чтобы сделать это, выделите в представлении конструктора формы первое текстовое поле TextBoxTitle и в окне «Свойства» для него найдите категорию «Данные», а под ним свойство DataBindings:
Раскройте напротив свойства Text выпадающий список и в открывшемся окне раскройте узел «Другие источники данных» и вложенный в него «Источники данных проекта». Вы увидите созданный ранее класс Book и его поля, как показано ниже на рисунке. Выберите поле Title для его привязки к свойству Text для текстового поля:
В результате вы должны увидеть следующее — напротив свойства Text появился индикатор привязки к источнику данных — bookBindingSource — Title:
Также обратите внимание на нижнюю часть под формой в представлении конструктора — можно увидеть добавленный к форме источник данных с именем bookBindingSource:
Проделайте аналогичную привязку к полям класса Book для остальных элементов формы:
Для элемента TextBoxAuthor необходимо выбрать привязку данных для свойства Text к полю Author в классе Book. Но в этот раз нужно уже выбирать поле из созданного источника bookBindingSource, поскольку теперь он есть на форме:
Для элемента DateTimePickerDatePublished необходимо выбрать привязку данных для свойства Value к полю DatePublished в классе Book:
Теперь оба текстовых поля формы и элемент для редактирования года издания книги привязаны к источнику данных, и мы можем приступить к программированию наших форм.
Программируем главную форму приложения (FrmDataGridViewSampleMain)
Добавление полей формы
В начало класса формы мы добавим список книг с именем books, а также флаг cancelContextMenu, который будет отвечать за то, чтобы не показывать контекстное меню для элемента DataGridView при определённых условиях (какие именно это условия мы узнаем чуть позже):
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
namespace DataGridViewSample {
public partial class FrmDataGridViewSampleMain : Form {
/// <summary>
/// список книг
/// </summary>
private List<Book> books = new List<Book>();
/// <summary>
/// флаг отмены отображения контекстного меню для элемента DataGridView
/// </summary>
private bool cancelContextMenu = false;
// ... остальной код формы
}
}
Вставьте код для этих двух полей в начало класса формы FrmDataGridViewSampleMain, как показано в листинге и сохраните изменения, нажав Ctrl+S.
Инициализация списка книг тестовыми данными
Далее нам нужно инициализировать некоторую тестовые данные с книгами, добавив их в список books. Эти данные будут затем загружаться в элемент DataGridView сразу при запуске приложения. Добавим в класс формы новый метод InitTestBooksData(), который будет инициализировать список книг и добавлять туда некоторые известные произведения классиков литературы с их авторами и годами публикации книг. Для даты публикации книги в нашем приложении будет важен только год издания, поэтому число и месяц публикации произведения мы будем принимать везде по умолчанию за 1 января того самого года, в котором была издана книга:
private void InitTestBooksData() {
books.Add(new Book("Война и мир", "Лев Николаевич Толстой", DateTime.Parse("1867-01-01")));
books.Add(new Book("Анна Каренина", "Лев Николаевич Толстой", DateTime.Parse("1877-01-01")));
books.Add(new Book("После бала", "Лев Николаевич Толстой", DateTime.Parse("1911-01-01")));
books.Add(new Book("Юность", "Лев Николаевич Толстой", DateTime.Parse("1857-01-01")));
books.Add(new Book("Кавказский пленник", "Лев Николаевич Толстой", DateTime.Parse("1872-01-01")));
books.Add(new Book("Преступление и наказание", "Фёдор Михайлович Достоевский", DateTime.Parse("1866-01-01")));
books.Add(new Book("Евгений Онегин", "Александр Сергеевич Пушкин", DateTime.Parse("1833-01-01")));
books.Add(new Book("Капитанская дочка", "Александр Сергеевич Пушкин", DateTime.Parse("1836-01-01")));
books.Add(new Book("Руслан и Людмила", "Александр Сергеевич Пушкин", DateTime.Parse("1820-01-01")));
books.Add(new Book("Метель", "Александр Сергеевич Пушкин", DateTime.Parse("1831-01-01")));
books.Add(new Book("Пиковая дама", "Александр Сергеевич Пушкин", DateTime.Parse("1834-01-01")));
books.Add(new Book("Мать", "Максим Горький", DateTime.Parse("1906-01-01")));
books.Add(new Book("Мёртвые души", "Николай Васильевич Гоголь", DateTime.Parse("1842-01-01")));
books.Add(new Book("Шинель", "Николай Васильевич Гоголь", DateTime.Parse("1842-01-01")));
books.Add(new Book("Тарас Бульба", "Николай Васильевич Гоголь", DateTime.Parse("1835-01-01")));
books.Add(new Book("Нос", "Николай Васильевич Гоголь", DateTime.Parse("1836-01-01")));
books.Add(new Book("Вечера на хуторе близ Диканьки", "Николай Васильевич Гоголь", DateTime.Parse("1830-01-01")));
books.Add(new Book("Ночь перед рождеством", "Николай Васильевич Гоголь", DateTime.Parse("1832-01-01")));
books.Add(new Book("Вий", "Николай Васильевич Гоголь", DateTime.Parse("1835-01-01")));
books.Add(new Book("Повесть о капитане Копейкине", "Николай Васильевич Гоголь", DateTime.Parse("1842-01-01")));
books.Add(new Book("Заколдованное место", "Николай Васильевич Гоголь", DateTime.Parse("1832-01-01")));
books.Add(new Book("Портрет", "Николай Васильевич Гоголь", DateTime.Parse("1835-01-01")));
books.Add(new Book("Тихий Дон", "Михаил Александрович Шолохов", DateTime.Parse("1928-01-01")));
}
Метод для фильтрации списка книг
Теперь создадим метод GetFilteredBooks(). Он будет возвращать отфильтрованный список книг, который мы будем формировать из нашего исходного списка books, в зависимости от содержимого текстового поля с фильтром TextBoxSearch. Как только мы будем что-то вводить в поле-фильтр TextBoxSearch, то этот введённый текст будет приводиться к нижнему регистру, и мы будем просматривать все книги из списка books, пытаясь найти среди их названий, авторов и годов публикации введённый текст в поле-фильтре. Если текст будет найден, то книга будет добавлена в результирующий список result, в противном же случае она будет проигнорирована, что в дальнейшем придаст элементу DataGridView эффект динамической фильтрации при каждом вводе текста в поисковый фильтр. Код этого метода представлен ниже, добавим его в класс формы:
private List<Book> GetFilteredBooks() {
List<Book> result = new List<Book>();
string searchString = TextBoxSearch.Text;
if (searchString.Length == 0) {
return books;
}
searchString = searchString.ToLower();
foreach (Book book in books) {
if ((book.Title.Length > 0 && book.Title.ToLower().Contains(searchString)) ||
(book.Author.Length > 0 && book.Author.ToLower().Contains(searchString)) ||
(book.YearPublished.Length > 0 && book.YearPublished.Contains(searchString))) {
result.Add(book);
}
}
return result;
}
Метод для обновления содержимого элемента DataGridView
Далее мы добавим в код формы метод RefreshDataGridView(), который будет обновлять данные в элементе DataGridView главной формы. В качестве источника данных (свойство DataSource элемента DataGridView) мы будем устанавливать результат вызова метода GetFilteredBooks(). При обновлении элемента DataGridView мы также установим названия его столбцов и их ширину. Ниже код этого метода:
private void RefreshDataGridView() {
DataGridViewBooks.DataSource = null;
DataGridViewBooks.DataSource = GetFilteredBooks();
DataGridViewBooks.Columns["Title"].HeaderText = "Название";
DataGridViewBooks.Columns["Title"].Width = 200;
DataGridViewBooks.Columns["Author"].HeaderText = "Автор";
DataGridViewBooks.Columns["Author"].Width = 200;
DataGridViewBooks.Columns["DatePublished"].HeaderText = "Дата издания";
DataGridViewBooks.Columns["DatePublished"].Width = 200;
DataGridViewBooks.Columns["DatePublished"].Visible = false;
DataGridViewBooks.Columns["YearPublished"].HeaderText = "Год публикации";
DataGridViewBooks.Columns["YearPublished"].Width = 126;
}
Метод для отображения внутреннего содержимого списка книг
Теперь нам будет нужен отдельный метод для обновления текстового поля TextBoxBooks, которое используется для отображения внутреннего содержимого основного списка books. Назовём новый метод UpdateBooksListDetails() и добавим к коду главной формы:
private void UpdateBooksListDetails() {
StringBuilder sb = new StringBuilder();
sb.Append("Books: [\r\n");
foreach (Book b in books) {
sb.Append(b.ToString());
sb.Append("\r\n");
}
sb.Append("]");
TextBoxBooks.Text = sb.ToString();
}
Как видим, он просто пробегает циклом foreach по списку книг и добавляет текстовое представление очередной книги к строковому буферу (переменная sb). В конце метода содержимое строкового буфера sb мы записываем в свойство Text текстового поля TextBoxBooks.
Метод для обновления всех данных (список книг в элементе DataGridView и внутреннее содержимое списка книг)
Создадим ещё один небольшой метод RefreshGridAndBookDetails(), который будет вызывать два уже ранее добавленных метода. Этот метод будет сразу обновлять и сам элемент DataGridView, и текстовое поле с содержимым списка books:
private void RefreshGridAndBookDetails() {
RefreshDataGridView();
UpdateBooksListDetails();
}
Метод для управления доступностью кнопки «Добавить книгу»
Добавим метод UpdateButtonAddBookState(), который будет регулировать доступность кнопки «Добавить книгу» . Кнопка должна быть доступна только тогда, когда оба текстовых поля с названием и автором книги содержат текст:
private void UpdateButtonAddBookState() {
ButtonAddBook.Enabled = TextBoxTitle.Text.Length > 0 && TextBoxAuthor.Text.Length > 0;
}
Пишем логику при загрузке главной формы
Нам нужно добавить код, который будет выполняться сразу при загрузке формы. Для этого нужно сгенерировать в коде формы обработчик события Load. Это можно сделать перейдя к представлению конструктора формы и дважды кликнув по форме — будет добавлен пустой метод FrmDataGridViewSampleMain_Load. Теперь мы добавим в него следующий код с вызовом трёх методов InitTestBooksData(), RefreshGridAndBookDetails() и UpdateButtonAddBookState():
private void FrmDataGridViewSampleMain_Load(object sender, EventArgs e) {
InitTestBooksData();
RefreshGridAndBookDetails();
UpdateButtonAddBookState();
}
Как видим, при загрузке программы и главной формы будут производиться следующие действия:
- список с книгами books будет наполнен тестовыми данными — это достигается вызовом метода InitTestBooksData()
- будет обновлено содержимое элемента DataGridView и текстового поля TextBoxBooks — это достигается вызовом метода RefreshGridAndBookDetails()
- будет установлена доступность кнопки «Добавить книгу» — это достигается вызовом метода UpdateButtonAddBookState()
Теперь вернёмся в представление конструктора формы и дважды кликнем по кнопке «Добавить книгу», чтобы сгенерировался метод-обработчик для события Click (т.е. события клика по кнопке). Добавим в него следующий код:
private void ButtonAddBook_Click(object sender, EventArgs e) {
DateTime selectedDate = DateTimePickerDatePublished.Value;
DateTime truncatedDate = DateTime.Parse(selectedDate.ToString("dd.MM.yyyy"));
Book newBook = new Book(TextBoxTitle.Text, TextBoxAuthor.Text, truncatedDate);
books.Add(newBook);
RefreshGridAndBookDetails();
TextBoxTitle.Text = "";
TextBoxAuthor.Text = "";
DateTimePickerDatePublished.Value = DateTime.Now;
TextBoxTitle.Focus();
}
В переменную selectedDate мы получаем значение даты и времени, выбранное в элементе DateTimePickerDatePublished. Это значение содержит выбранную дату вместе с текущим временем. Время нам не нужно, поэтому мы записываем в переменную truncatedDate значение, которое содержит только дату. Далее остаётся только создать новый экземпляр книги newBook со значениями названия, автора и даты публикации и добавить его в основной список books, после чего обновить данные в элементе DataGridView и текстовом поле с содержимым всего списка книг. Напоследок мы также очищаем все поля в нижней части формы и устанавливаем дату в текущую, а также явно устанавливаем фокус на текстовое поле с названием книги — это необходимо для удобства последовательного ввода нескольких книг.
Вернёмся к представлению конструктора главной формы. Нам нужно сгенерировать в коде главной формы обработчики следующих событий для элемента DataGridView:
- CellEndEdit — это событие возникает при завершении редактирования содержимого ячейки
- DataError — это событие возникает при появлении ошибки при редактировании ячейки. В нашем случае оно будет вызываться при попытке установить некорректное значение года публикации книги (к примеру, если попытаемся ввести некорректную дату)
- MouseDown — событие возникает при клике мышью на элементе DataGridView. Его мы будем обрабатывать в случае нажатия правкой кнопки мыши в целях полного выделения строки, над которой произошёл клик, а также установки специального флага скрытия контекстного меню
Для этого выбираем на форме элемент DataGridView, а затем в окне «Свойства» кликаем на иконку «молнии». В списке событий находим сначала CellEndEdit и дважды кликаем напротив имени этого события, в результате чего в коде формы будет сгенерирован пустой метод-обработчик DataGridViewBooks_CellEndEdit. Аналогичное действие проделываем, дважды кликая напротив событий DataError и MouseDown.
Теперь пора написать код для этих сгенерированных методов-обработчиков.
Начнём с первого — DataGridViewBooks_CellEndEdit. Внутри него мы напишем код, который из входного параметра e с типом DataGridViewCellEventArgs получит индексы строки и столбца в переменные row и col, соответственно. После этого в переменную cell мы получим ссылку на ячейку элемента DataGridView, которая и была отредактирована. Далее нам нужно получить содержимое ячейки с помощью свойства Value — его мы устанавливаем в переменную cellValue с типом object (на этом этапе мы не знаем информацию о точном типе данных для значения отредактированной ячейки). Теперь мы можем получить ссылку на редактируемую книгу в переменную book — индекс отредактированной книги в списке books совпадает с индексом строки в элементе DataGridView. А чтобы обновить конкретное свойство экземпляра книги мы смотрим на индекс столбца col и приводим cellValue уже к конкретному типу данных и устанавливаем в конкретное свойство для экземпляра книги. После этого мы можем вызывать метод UpdateBooksListDetails() для обновления содержимого текстового поля TextBoxBooks:
private void DataGridViewBooks_CellEndEdit(object sender, DataGridViewCellEventArgs e) {
int row = e.RowIndex;
int col = e.ColumnIndex;
DataGridViewCell cell = DataGridViewBooks[col, row];
object cellValue = cell.Value;
Book book = books[row];
switch (col) {
case 0:
book.Title = (string)cellValue;
break;
case 1:
book.Author = (string)cellValue;
break;
case 2:
book.DatePublished = (DateTime)cellValue;
break;
}
UpdateBooksListDetails();
}
Теперь перейдем к методу-обработчику DataGridViewBooks_DataError и напишем код для него.
Аналогичным образом из параметра e можно извлечь индексы столбца и строки в переменные col и row. Далее нас будет интересовать свойство EditedFormattedValue для ячейки по этим индексам — его мы получим в переменную editedValue. В конце метода мы проверим, что если тип исключения — это FormatException и при этом индекс столбца равен 2 (т.е. мы редактируем какую-то ячейку в столбце «Год публикации»), то мы выводим сообщение о необходимости ввода корректной даты, а также отменяем событие, устанавливая свойство Cancel в true. Ниже код этого метода:
private void DataGridViewBooks_DataError(object sender, DataGridViewDataErrorEventArgs e) {
int col = e.ColumnIndex;
int row = e.RowIndex;
object editedValue = DataGridViewBooks[col, row].EditedFormattedValue;
if (e.Exception is FormatException fe && col == 2) {
MessageBox.Show("Введите корректную дату, т.к. значение '" + editedValue.ToString() + "' не является датой", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
}
}
Перейдем к последнему методу-обработчику для элемента DataGridView — DataGridViewBooks_MouseDown и напишем код для него. Прежде всего мы должны проверить, что клик по таблице с книгами произведён именно правой кнопкой мыши (MouseButtons.Right). Далее мы используем специальный метод HitTest, доступный для элемента DataGridView — он поможет вернуть специальную информацию о координатах клика в переменную hitTestInfo, в частности, мы сможем получить доступ к индексу строки и столбца, по которым произошёл клик мышью. Мы проверим, что если эти индексы — неотрицательные, то это значит, что текущее выделение для элемента DataGridView необходимо очистить и выделить только ту строку, над которой находился курсор мыши в момент клика. В этом случае мы также сбросим флаг cancelContextMenu в false — это означает, что контекстное меню показать надо. В противном же случае — если мы кликнули где-то по заголовкам или служебным областям элемента DataGridView — индексы будут отрицательными и в развилке else мы выставим флаг cancelContextMenu в true:
private void DataGridViewBooks_MouseDown(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
var hitTestInfo = DataGridViewBooks.HitTest(e.X, e.Y);
if (hitTestInfo.RowIndex >= 0 && hitTestInfo.ColumnIndex >= 0) {
DataGridViewBooks.ClearSelection();
DataGridViewBooks.Rows[hitTestInfo.RowIndex].Selected = true;
cancelContextMenu = false;
} else {
cancelContextMenu = true;
}
}
}
Раз уж мы заговорили про специальный флаг cancelContextMenu — пора им воспользоваться и написать логику, которая будет отменять показ контекстного меню. Для этого нужно вернуться на главную форму в представление конструктора, выбрать контекстное меню ContextMenuStripForGrid и сгенерировать для него обработчик события Opening. Это событие возникает в момент открытия контекстного меню, при этом его можно отменить, тогда контекстное меню не будет отображено. В коде мы как раз проверим наш специальный флаг необходимости отмены показа контекстного меню и отменим само событие, если флаг установлен:
private void ContextMenuStripForGrid_Opening(object sender, System.ComponentModel.CancelEventArgs e) {
if (cancelContextMenu) {
e.Cancel = true;
}
}
Обработка событий контекстного меню
Теперь мы напишем код, который будет обрабатывать события клика на элементах контекстного меню ContextMenuStripForGrid. Для этого нужно перейти к представлению конструктора формы, выбрать в нижней части элемент ContextMenuStripForGrid и дважды кликнуть по пункту меню «&Удалить выбранную книгу». В результате будет сгенерирован обработчик клика на этом пункте меню с названием MenuItemRemoveBook_Click. Затем нужно повторить то же самое для пункта меню «&Редактировать выбранную книгу» и сгенерировать обработчик MenuItemEditBook_Click.
Теперь напишем для них код:
private void MenuItemRemoveBook_Click(object sender, EventArgs e) {
DataGridViewSelectedRowCollection selectedRows = DataGridViewBooks.SelectedRows;
foreach (DataGridViewRow selectedRow in selectedRows) {
int rowIndex = selectedRow.Index;
if (rowIndex < 0) {
continue;
}
Book book = books[rowIndex];
DialogResult dlgConfirm = MessageBox.Show("Удалить эту книгу?\r\n\r\nАвтор: " + book.Author + "\r\nНазвание: " + book.Title + "\r\nГод публикации: " + book.YearPublished, "Подтвердите", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (dlgConfirm == DialogResult.Yes) {
books.RemoveAt(rowIndex);
}
}
RefreshGridAndBookDetails();
}
private void MenuItemEditBook_Click(object sender, EventArgs e) {
DataGridViewSelectedRowCollection selectedRows = DataGridViewBooks.SelectedRows;
foreach (DataGridViewRow selectedRow in selectedRows) {
int rowIndex = selectedRow.Index;
if (rowIndex < 0) {
continue;
}
Book book = books[rowIndex];
FrmEditBook frmEdit = new FrmEditBook();
frmEdit.EditedBook = book;
frmEdit.BookUpdatedEvent += FrmEdit_BookUpdatedEvent;
frmEdit.Show();
}
}
Как видим, в обработчике MenuItemRemoveBook_Click происходит получение выбранных строк таблицы в коллекцию selectedRows, а затем цикл по этой коллекции. На самом деле выбранная строка всегда будет одна, но для надёжности мы делаем цикл и в цикле проверяем, что индекс выбранной строки неотрицательный. В этом случае мы получаем выбранную книгу из списка books (её индекс в списке равен индексу выбранной строки таблицы) и выдаём диалоговое окно с подтверждением необходимости удаления книги. Если в окне диалога удаление подтверждено, то книга удаляется из списка.
Во втором обработчике MenuItemEditBook_Click у нас немного другая задача. Мы должны отобразить вторую форму для редактирования выбранной в таблице записи. Легко заметить, что логика с получением выбранных строк таблицы и проверки в цикле индекса аналогична первому обработчику, только в этот раз мы вместо удаления книги создаём экземпляр формы FrmEditBook, устанавливаем её свойство EditedBook текущей выбранной книге, а также подписываемся на событие BookUpdatedEvent, после чего отображаем форму.
Ниже код нового метода FrmEdit_BookUpdatedEvent, который надо добавить в код главной формы. Всё, что он делает, — это вызывает метод обновления данных на форме:
private void FrmEdit_BookUpdatedEvent(Book updatedBook) {
RefreshGridAndBookDetails();
}
Последнее, что нам осталось добавить в код главной формы — это реакция на изменения текстовых полей. У нас их на форме три:
- TextBoxTitle — для ввода названия книги (при добавлении новой)
- TextBoxAuthor — для ввода автора книги (при добавлении новой)
- TextBoxSearch — поисковое поле-фильтр для быстрого поиска по списку книг
Кликните дважды по каждому из них из представления конструктора формы — должны сгенерироваться пустые методы-обработчики для события TextChanged, которое возникает при изменении текста в текстовом поле.
Наполним эти пустые методы следующим образом:
private void TextBoxTitle_TextChanged(object sender, EventArgs e) {
UpdateButtonAddBookState();
}
private void TextBoxAuthor_TextChanged(object sender, EventArgs e) {
UpdateButtonAddBookState();
}
private void TextBoxSearch_TextChanged(object sender, EventArgs e) {
RefreshDataGridView();
}
При изменении названия или автора книги будет вызываться UpdateButtonAddBookState() — это необходимо, чтобы делать кнопку «Добавить книгу» доступной при наличии всех данных по книге и наоборот — делать её недоступной, если хотя бы одно из полей не заполнено. А вот при изменении поля-фильтра мы будем вызывать RefreshDataGridView(), который «перерисует» элемент DataGridView — в зависимости от текста в поле-фильтре.
На этом код главной формы полностью готов.
Программируем форму редактирования книги (FrmEditBook)
Теперь, когда код для главной формы полностью готов, перейдем к написанию кода для второй формы, которая будет отображаться при редактировании выбранной в списке книги.
Сначала дважды кликнем по форме из представления конструктора — это сгенерирует пустой метод-обработчик FrmEditBook_Load для события Load формы.
Затем возвращаемся снова к конструктору формы и дважды кликаем по кнопке ButtonCancel — в результате будет сгенерирован пустой метод-обработчик ButtonCancel_Click, который будет отвечать за обработку события клика по кнопке «&Отмена».
Аналогичное действие делаем для второй кнопки ButtonOK — из представления конструктора формы дважды кликаем по ней, чтобы сгенерировать пустой метод-обработчик ButtonOK_Click.
Далее необходимо наполнить пустые сгенерированные методы представленным ниже кодом или просто выделить весь фрагмент и заменить им код в редакторе:
using System;
using System.Windows.Forms;
namespace DataGridViewSample {
public partial class FrmEditBook : Form {
/// <summary>
/// делегат, который описывает контракт для события обновления данных для книги
/// </summary>
/// <param name="updatedBook">отредактированная книга</param>
public delegate void DelegateUpdateBook(Book updatedBook);
/// <summary>
/// событие обновления данных для книги
/// </summary>
public event DelegateUpdateBook BookUpdatedEvent;
/// <summary>
/// свойство содержит ссылку на редактируемую книгу
/// </summary>
public Book EditedBook { get; set; }
public FrmEditBook() {
InitializeComponent();
}
private void FrmEditBook_Load(object sender, EventArgs e) {
// Помещаем в источник данных экземпляр для редактируемой книги
bookBindingSource.Add(EditedBook);
}
private void ButtonCancel_Click(object sender, EventArgs e) {
Close();
}
private void ButtonOK_Click(object sender, EventArgs e) {
// Получаем текущую обновлённую книгу из свойства Current
// для источника данных bookBindingSource
Book bookUpdated = (Book)bookBindingSource.Current;
// Если событие BookUpdatedEvent не равно null, это значит, что
// на него есть подписчики. Следовательно, вызовем это событие, передавая
// в него экземпляр обновлённой книги
if (BookUpdatedEvent != null) {
BookUpdatedEvent(bookUpdated);
}
Close();
}
}
}
Код формы для редактирования книги снабжён комментариями, к тому же он совсем несложный, поэтому разбирать его отдельно не будем.
Наше приложение полностью готово, можем запустить его из среды разработки при помощи клавиши F5 или нажав на кнопку «Пуск».
Заключение
Попробуйте поработать со списком книг — отфильтровать его содержимое, вводя различный текст в поисковое поле-фильтр. Также можно редактировать отдельные записи прямо в таблице — либо при помощи двойного клика по ячейкам, либо нажимая клавишу F2 для входа в режим редактирования ячейки. Обратите внимание, что ячейки таблицы с годом издания книги невозможно отредактировать. Год издания можно поменять только через вторую форму «Редактировать книгу», которая открывается из контекстного меню при клике правой кнопкой мыши по строкам таблицы.
Также попробуйте удалить пару книг из таблицы и добавить пару своих собственных тестовых книг, используя нижнюю часть формы. В этой тестовой программе мы не сохраняем данные о книгах и не загружаем их из внешнего файла или базы данных, поэтому при выходе из нашей программы состояние книг будет каждый раз сбрасываться. При необходимости можно доработать программу, чтобы она сохраняла книги куда-то в файл, а также загружала их из файла при следующем запуске, однако это выходит за рамки статьи, т.к. основной задачей было показать работу с элементом DataGridView.
Друзья, на этом всё, надеюсь, что урок вам понравился, при наличии вопросов/пожеланий — используйте форму комментариев внизу статьи.
Ссылка на готовый проект из этой статьи:
https://allineed.ru/our-products/download/4-allineed-ru-examples/15-csharp-demo-working-with-datagridview
Удачи и успехов в написании хороших программ!
Сегодня я решил написать Вам о том, как работать с элементом управления DataGridView в языке программирования C#.
DataGridView — очень мощный инструмент для работы с данными. Он очень гибок и позволяет автоматизировать вывод информации. Я постараюсь рассказать Вам о базовой работе с данным элементом, а так же привести пример автоматизации обновления данных в таблице.
Для тех, кто не знает о элементе управления DataGridView — скажу что данный контрол позволяет вывести таблицу с данными в Вашей программе. Данный элемент управления имеет огромное число настроек. Благодаря этому Вы скорей всего сможете подстроить внешний вид таблицы так, как Вам нужно. Все настройки доступны в панели свойств элемента в Visual Studio. Я буду задавать свойства нашего элемента пряма в коде, для большей наглядности.
И так создадим новый проект WinForms и добавим на форму элемент DataGridView. При добавлении элемента DataGridView появляется окно, где можно указать источник данных для нашей таблицы. Просто закроем данное окно. Перейдем в событие загрузки формы и зададим шапку для нашей таблицы.
private void Form1_Load(object sender, EventArgs e) { //создадим таблицу вывода товаров с колонками //Название, Цена, Остаток var column1 = new DataGridViewColumn(); column1.HeaderText = "Название"; //текст в шапке column1.Width = 100; //ширина колонки column1.ReadOnly = true; //значение в этой колонке нельзя править column1.Name = "name"; //текстовое имя колонки, его можно использовать вместо обращений по индексу column1.Frozen = true; //флаг, что данная колонка всегда отображается на своем месте column1.CellTemplate = new DataGridViewTextBoxCell(); //тип нашей колонки var column2 = new DataGridViewColumn(); column2.HeaderText = "Цена"; column2.Name = "price"; column2.CellTemplate = new DataGridViewTextBoxCell(); var column3 = new DataGridViewColumn(); column3.HeaderText = "Остаток"; column3.Name = "count"; column3.CellTemplate = new DataGridViewTextBoxCell(); dataGridView1.Columns.Add(column1); dataGridView1.Columns.Add(column2); dataGridView1.Columns.Add(column3); dataGridView1.AllowUserToAddRows = false; //запрешаем пользователю самому добавлять строки for (int i = 0; i < 5; ++i) { //Добавляем строку, указывая значения колонок поочереди слева направо dataGridView1.Rows.Add("Пример 1, Товар " + i, i * 1000, i); } for (int i = 0; i < 5; ++i) { //Добавляем строку, указывая значения каждой ячейки по имени (можно использовать индекс 0, 1, 2 вместо имен) dataGridView1.Rows.Add(); dataGridView1["name", dataGridView1.Rows.Count - 1].Value = "Пример 2, Товар " + i; dataGridView1["price", dataGridView1.Rows.Count - 1].Value = i * 1000; dataGridView1["count", dataGridView1.Rows.Count - 1].Value = i; } //А теперь простой пройдемся циклом по всем ячейкам for (int i = 0; i < dataGridView1.Rows.Count; ++i) { for (int j = 0; j < dataGridView1.Columns.Count; ++j) { //Значения ячеек хряняться в типе object //это позволяет хранить любые данные в таблице object o = dataGridView1[j, i].Value; } } } }
В целом это и есть базовая работа с элементом DataGridView. По сути мы имеем работу с матрицей (двумерным массивом). Давайте теперь рассмотрим базовый вариант автоматизации обновления данных в таблице — механизм привязки (Binding).
Для этого создадим класс, который будет играть роль одной строки. Т.е. по сути нам нужно создать класс, описывающий колонки нашей таблицы.
class SampleRow { public string Name { get; set; } //обязательно нужно использовать get конструкцию public float Price { get; set; } public int Count { get; set; } public string Hidden = ""; //Данное свойство не будет отображаться как колонка public SampleRow(string name, float price, int count) { this.Name = name; this.Price = price; this.Count = count; } }
Теперь мы можем написать следующий код в событии формы OnLoad:
private void Form1_Load(object sender, EventArgs e) { BindingList<SampleRow> data = new BindingList<SampleRow>(); //Специальный список List с вызовом события обновления внутреннего состояния, необходимого для автообновления datagridview data.Add(new SampleRow("Товар 1", 100, 1)); data.Add(new SampleRow("Товар 2", 200, 2)); data.Add(new SampleRow("Товар 3", 300, 3)); dataGridView1.DataSource = data; data.Add(new SampleRow("Товар 4", 400, 4)); }
DataGridView — стандартный GUI компонент для отображения и редактирования таблиц. Здесь коротко рассмотрены основные моменты работы с этим классом.
Перекиньте стандартным способом в форму компонент DataGridView.
Источник данных при создании можно не указывать, так как DataGridView позволяет хранить данные внутри себя и добавлять/удалять их на лету, во время выполнения (runtime). После этого редактором свойств настройте поведение по умолчанию нового экземпляра DataGridView. Я обычно меняю свойства AllowUserToAddRows на false, AllowUserToDeleteRows на false, ReadOnly на true. Можно также переименовать экземпляр из dataGridView1 в что-нибудь более осмысленное, подходящее для Вашей программы.
Добавление строк и столбцов. Столбцы и строки можно добавлять во время выполнения программы (подробнее см. [1]). Пример добавления строк:
dataGridView1->Rows->Add();
Однако если назначение и структура таблицы (количество и наименование столбцов) известны заранее, то можно редактором свойств добавить столбцы. Для этого редактируют свойство Columns.
Стиль текста заголовка. Пример, как можно установить жирный шрифт в заголовке таблицы:
DataGridView dgv = 0 == tabControl1.SelectedIndex ? ОсновнойDGV : РезервDGV; DataGridViewCellStyle style = dgv.ColumnHeadersDefaultCellStyle; style.Font = new Font(style.Font, FontStyle.Bold); // Жирный текст
Как поменять цвет фона заголовка и цвет шрифта:
dgv.EnableHeadersVisualStyles = false;
dgv.ColumnHeadersDefaultCellStyle.BackColor = Color.Navy;
dgv.ColumnHeadersDefaultCellStyle.ForeColor = Color.White;
Работа с ячейками. Обращение к ячейкам DataGridView довольно простое. Индексация столбцов (Columns) и строк (Rows) идет относительно нуля. Столбец с индексом 0 самый левый, и строка с индексом 0 самая верхняя. Количество строк можно получить через свойство RowCount. Добавляются строки методом Удаляются строки методом Rows->Add(), удаляются методом Rows->RemoveAt(номер строки). Пример добавления и удаления строк:
// Добавим в dataGridView1 4 строки: dataGridView1->Rows->Add(); dataGridView1->Rows->Add(); dataGridView1->Rows->Add(); dataGridView1->Rows->Add();
// Удалим все строки из dataGridView1:
while (0 != dataGridView1->RowCount) dataGridView1->Rows->RemoveAt(0);
Более простой способ удаления строк:
dataGridView1->Rows->Clear();
Текущая строка. Узнать номер текущей строки можно через HitTestInfo->RowIndex:
int idx = dataGridView1->HitTestInfo->RowIndex;
Установить (поменять) текущую строку можно через свойство CurrentCell (в примере устанавливаем третью текущую строку):
int idx = 2; dataGridView1->CurrentCell = dataGridView1->Rows[idx]->Cells[0];
Текущая строка помечена в таблице треугольничком:
// Необязательный шаг: отмена выделения текущей ячейки,
// чтобы она не подкрашивалась: dataGridView1->CurrentCell->Selected = false;
Вид таблицы после отмены выделения текущей ячейки:
Изменение данных в ячейках. Менять данные в ячейках таблицы можно только тогда, когда существуют соответствующий столбец и соответствующая строка, иначе произойдет ошибка выполнения («System.ArgumentOutOfRangeException» произошло в mscorlib.dll Дополнительные сведения: Индекс за пределами диапазона. Индекс должен быть положительным числом, a его размер не должен превышать размер коллекции.). После добавления строки методом Add все значения в ячейках добавленной строки будут пустые. К ячейке таблицы можно обращаться по номеру столбца и номеру строки через свойство Value.
Пример добавления строк и заполнения таблицы:
int i = 0; //нумерация строк начинается с 0
if ( (dataGridView1->RowCount - 1) < i ) dataGridView1->Rows->Add();
// № строки добавляем в первый столбец Cells[0]: dataGridView1->Rows[i]->Cells[0]->Value = (i+1).ToString();
// Текст добавим во второй столбец Cells[1]: dataGridView1->Rows[i]->Cells[1]->Value = "Текст в ячейке";
i++; //переходим к следующей строке dataGridView1->Rows[i]->Cells[0]->Value = (i+1).ToString(); ...
Стиль, цвет текста. Внешний вид текста в ячейке можно менять через свойство Style. Пример изменения цвета нужной ячейки на C#:
private void msgtable(string msg, Color textcolor) { dataGridView1.Rows[rowidx].Cells[2].Style.ForeColor = textcolor; dataGridView1.Rows[rowidx].Cells[2].Value = msg; }
...
case TCalibReport.ITERATE_OK: msgtable("OK", Color.Green); break; ...
Пример изменения шрифта ячейки на жирный:
Font font = new Font(DataGridView.DefaultFont, FontStyle.Bold);
dgv.Rows[ТекущаяСтрока].Cells[ТекущийСтолбец].Style.Font = font;
Как обращаться к столбцам не по их индексу, а по имени? Нумерация строк и столбцов начинается с нуля, и когда нам нужно обратиться к конкретной ячейке строки, то это можно сделать через числовой индекс: Rows[индексстроки].Cells[индексстолбца]. Однако есть удобная возможность получить индекс столбца по имени типа столбца:
dgv.Rows[ТекущаяСтрока].Cells[УровеньУст.Index].Value = Установлено.ToString("F2", ci); dgv.Rows[ТекущаяСтрока].Cells[УровеньСчит.Index].Value = Считано.ToString("F2", ci);
В этом примере УровеньУст и УровеньСчит — типы столбцов, которые были установлены во время компиляции визуальным редактированием свойства Columns таблицы dgv. Используется свойство Index этих типов.
Клик на заголовке строки. Обработка клика на заголовке строки на C#:
private void dataGridView1_RowHeaderMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e) { rowstart = e.RowIndex; rowend = e.RowIndex; DisableGUI(); bwCalibr.RunWorkerAsync(); }
Как удалить последнюю пустую строку?
Ответ: после манипуляции со строками и добавления новых строк установите в false свойство AllowUserToAddRows:
dataGridView1.AllowUserToAddRows = false;
[Ссылки]
1. Все о DataGridView. Учебник site:datagridview.narod.ru.
2. C#: экспорт/импорт DataGridView в XML и HTML.
DataGridView in Windows Forms – Tips, Tricks and Frequently Asked Questions(FAQ)
DataGridView control is a Windows Forms control that gives you the ability to customize and edit tabular data. It gives you number of properties, methods and events to customize its appearance and behavior. In this article, we will discuss some frequently asked questions and their solutions. These questions have been collected from a variety of sources including some newsgroups, MSDN site and a few, answered by me at the MSDN forums.
Tip 1 – Populating a DataGridView
In this short snippet, we will populate a DataGridView using the LoadData() method. This method uses the SqlDataAdapter to populate a DataSet. The table ‘Orders’ in the DataSet is then bound to the BindingSource component which gives us the flexibility to choose/modify the data location.
C#
public partial class Form1 : Form
{
private SqlDataAdapter da;
private SqlConnection conn;
BindingSource bsource = new BindingSource();
DataSet ds = null;
string sql;
public Form1()
{
InitializeComponent();
}
private void btnLoad_Click(object sender, EventArgs e)
{
LoadData();
}
private void LoadData()
{
string connectionString = «Data Source=localhost;Initial Catalog=Northwind;» + «Integrated Security=SSPI;»;
conn = new SqlConnection(connectionString);
sql = «SELECT OrderID, CustomerID, EmployeeID, OrderDate, Freight,» + «ShipName, ShipCountry FROM Orders»;
da = new SqlDataAdapter(sql, conn);
conn.Open();
ds = new DataSet();
SqlCommandBuilder commandBuilder = new SqlCommandBuilder(da);
da.Fill(ds, «Orders»);
bsource.DataSource = ds.Tables[«Orders»];
dgv.DataSource = bsource;
}
}
VB.NET
Public Partial Class Form1
Inherits Form
Private da As SqlDataAdapter
Private conn As SqlConnection
Private bsource As BindingSource = New BindingSource()
Private ds As DataSet = Nothing
Private sql As String
Public Sub New()
InitializeComponent()
End Sub
Private Sub btnLoad_Click(ByVal sender As Object, ByVal e As EventArgs)
LoadData()
End Sub
Private Sub LoadData()
Dim connectionString As String = «Data Source=localhost;Initial Catalog=Northwind;» & «Integrated Security=SSPI;»
conn = New SqlConnection(connectionString)
sql = «SELECT OrderID, CustomerID, EmployeeID, OrderDate, Freight,» & «ShipName, ShipCountry FROM Orders»
da = New SqlDataAdapter(sql, conn)
conn.Open()
ds = New DataSet()
Dim commandBuilder As SqlCommandBuilder = New SqlCommandBuilder(da)
da.Fill(ds, «Orders»)
bsource.DataSource = ds.Tables(«Orders»)
dgv.DataSource = bsource
End Sub
End Class
Tip 2 – Update the data in the DataGridView and save changes in the database
After editing the data in the cells, if you would like to update the changes permanently in the database, use the following code:
C#
private void btnUpdate_Click(object sender, EventArgs e)
{
DataTable dt = ds.Tables[«Orders»];
this.dgv.BindingContext[dt].EndCurrentEdit();
this.da.Update(dt);
}
VB.NET
Private Sub btnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs)
Dim dt As DataTable = ds.Tables(«Orders»)
Me.dgv.BindingContext(dt).EndCurrentEdit()
Me.da.Update(dt)
End Sub
Tip 3 – Display a confirmation box before deleting a row in the DataGridView
Handle the UserDeletingRow event to display a confirmation box to the user. If the user confirms the deletion, delete the row. If the user clicks cancel, set e.cancel = true which cancels the row deletion.
C#
private void dgv_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
{
if (!e.Row.IsNewRow)
{
DialogResult res = MessageBox.Show(«Are you sure you want to delete this row?», «Delete confirmation»,
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (res == DialogResult.No)
e.Cancel = true;
}
}
VB.NET
Private Sub dgv_UserDeletingRow(ByVal sender As Object, ByVal e As DataGridViewRowCancelEventArgs)
If (Not e.Row.IsNewRow) Then
Dim res As DialogResult = MessageBox.Show(«Are you sure you want to delete this row?», «Delete confirmation», MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If res = DialogResult.No Then
e.Cancel = True
End If
End If
End Sub
Tip 4 – How to autoresize column width in the DataGridView
The snippet shown below, first auto-resizes the columns to fit its content. Then the AutoSizeColumnsMode is set to the ‘DataGridViewAutoSizeColumnsMode.AllCells’ enumeration value which automatically adjust the widths of the columns when the data changes.
C#
private void btnResize_Click(object sender, EventArgs e)
{
dgv.AutoResizeColumns();
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
}
VB.NET
Private Sub btnResize_Click(ByVal sender As Object, ByVal e As EventArgs)
dgv.AutoResizeColumns()
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
End Sub
Tip 5 — Select and Highlight an entire row in DataGridView
C#
int rowToBeSelected = 3; // third row
if (dgv.Rows.Count >= rowToBeSelected)
{
// Since index is zero based, you have to subtract 1
dgv.Rows[rowToBeSelected — 1].Selected = true;
}
VB.NET
Dim rowToBeSelected As Integer = 3 ‘ third row
If dgv.Rows.Count >= rowToBeSelected Then
‘ Since index is zero based, you have to subtract 1
dgv.Rows(rowToBeSelected — 1).Selected = True
End If
Tip 6 — How to scroll programmatically to a row in the DataGridView
The DataGridView has a property called FirstDisplayedScrollingRowIndex that can be used in order to scroll to a row programmatically.
C#
int jumpToRow = 20;
if (dgv.Rows.Count >= jumpToRow && jumpToRow >= 1)
{
dgv.FirstDisplayedScrollingRowIndex = jumpToRow;
dgv.Rows[jumpToRow].Selected = true;
}
VB.NET
Dim jumpToRow As Integer = 20
If dgv.Rows.Count >= jumpToRow AndAlso jumpToRow >= 1 Then
dgv.FirstDisplayedScrollingRowIndex = jumpToRow
dgv.Rows(jumpToRow).Selected = True
End If
Tip 7 — Calculate a column total in the DataGridView and display in a textbox
A common requirement is to calculate the total of a currency field and display it in a textbox. In the snippet below, we will be calculating the total of the ‘Freight’ field. We will then display the data in a textbox by formatting the result (observe the ToString(«c»)) while displaying the data, which displays the culture-specific currency.
C#
private void btnTotal_Click(object sender, EventArgs e)
{
if(dgv.Rows.Count > 0)
txtTotal.Text = Total().ToString(«c»);
}
private double Total()
{
double tot = 0;
int i = 0;
for (i = 0; i < dgv.Rows.Count; i++)
{
tot = tot + Convert.ToDouble(dgv.Rows[i].Cells[«Freight»].Value);
}
return tot;
}
VB.NET
Private Sub btnTotal_Click(ByVal sender As Object, ByVal e As EventArgs)
If dgv.Rows.Count > 0 Then
txtTotal.Text = Total().ToString(«c»)
End If
End Sub
Private Function Total() As Double
Dim tot As Double = 0
Dim i As Integer = 0
For i = 0 To dgv.Rows.Count — 1
tot = tot + Convert.ToDouble(dgv.Rows(i).Cells(«Freight»).Value)
Next i
Return tot
End Function
Tip 8 — Change the Header Names in the DataGridView
If the columns being retrieved from the database do not have meaningful names, we always have the option of changing the header names as shown in this snippet:
C#
private void btnChange_Click(object sender, EventArgs e)
{
dgv.Columns[0].HeaderText = «MyHeader1»;
dgv.Columns[1].HeaderText = «MyHeader2»;
}
VB.NET
Private Sub btnChange_Click(ByVal sender As Object, ByVal e As EventArgs)
dgv.Columns(0).HeaderText = «MyHeader1»
dgv.Columns(1).HeaderText = «MyHeader2»
End Sub
Tip 9 — Change the Color of Cells, Rows and Border in the DataGridView
C#
private void btnCellRow_Click(object sender, EventArgs e)
{
// Change ForeColor of each Cell
this.dgv.DefaultCellStyle.ForeColor = Color.Coral;
// Change back color of each row
this.dgv.RowsDefaultCellStyle.BackColor = Color.AliceBlue;
// Change GridLine Color
this.dgv.GridColor = Color.Blue;
// Change Grid Border Style
this.dgv.BorderStyle = BorderStyle.Fixed3D;
}
VB.NET
Private Sub btnCellRow_Click(ByVal sender As Object, ByVal e As EventArgs)
‘ Change ForeColor of each Cell
Me.dgv.DefaultCellStyle.ForeColor = Color.Coral
‘ Change back color of each row
Me.dgv.RowsDefaultCellStyle.BackColor = Color.AliceBlue
‘ Change GridLine Color
Me.dgv.GridColor = Color.Blue
‘ Change Grid Border Style
Me.dgv.BorderStyle = BorderStyle.Fixed3D
End Sub
Tip 10 — Hide a Column in the DataGridView
If you would like to hide a column based on a certain condition, here’s a snippet for that.
C#
private void btnHide_Click(object sender, EventArgs e)
{
this.dgv.Columns[«EmployeeID»].Visible = false;
}
VB.NET
Private Sub btnHide_Click(ByVal sender As Object, ByVal e As EventArgs)
Me.dgv.Columns(«EmployeeID»).Visible = False
End Sub
Tip 11 — Handle SelectedIndexChanged of a ComboBox in the DataGridView
To handle the SelectedIndexChanged event of a DataGridViewComboBox, you need to use the DataGridView.EditingControlShowing event as shown below. You can then retrieve the selected index or the selected text of the combobox.
C#
private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
ComboBox editingComboBox = (ComboBox)e.Control;
if(editingComboBox != null)
editingComboBox.SelectedIndexChanged += new System.EventHandler(this.editingComboBox_SelectedIndexChanged);
}
private void editingComboBox_SelectedIndexChanged(object sender, System.EventArgs e)
{
ComboBox comboBox1 = (ComboBox)sender;
// Display index
MessageBox.Show(comboBox1.SelectedIndex.ToString());
// Display value
MessageBox.Show(comboBox1.Text);
}
VB.NET
Private Sub dataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs)
Dim editingComboBox As ComboBox = CType(e.Control, ComboBox)
If Not editingComboBox Is Nothing Then
AddHandler editingComboBox.SelectedIndexChanged, AddressOf editingComboBox_SelectedIndexChanged
End If
End Sub
Private Sub editingComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim comboBox1 As ComboBox = CType(sender, ComboBox)
‘ Display index
MessageBox.Show(comboBox1.SelectedIndex.ToString())
‘ Display value
MessageBox.Show(comboBox1.Text)
End Sub
Tip 12 — Change Color of Alternate Rows in the DataGridView
C#
private void btnAlternate_Click(object sender, EventArgs e)
{
this.dgv.RowsDefaultCellStyle.BackColor = Color.White;
this.dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.Aquamarine;
}
VB.NET
Private Sub btnAlternate_Click(ByVal sender As Object, ByVal e As EventArgs)
Me.dgv.RowsDefaultCellStyle.BackColor = Color.White
Me.dgv.AlternatingRowsDefaultCellStyle.BackColor = Color.Aquamarine
End Sub
Tip 13 — Formatting Data in the DataGridView
The DataGridView exposes properties that enable you to format data such as displaying a currency column in the culture specific currency or displaying nulls in a desired format and so on.
C#
private void btnFormat_Click(object sender, EventArgs e)
{
// display currency in culture-specific currency for
this.dgv.Columns[«Freight»].DefaultCellStyle.Format = «c»;
// display nulls as ‘NA’
this.dgv.DefaultCellStyle.NullValue = «NA»;
}
VB.NET
Private Sub btnFormat_Click(ByVal sender As Object, ByVal e As EventArgs)
‘ display currency in culture-specific currency for
Me.dgv.Columns(«Freight»).DefaultCellStyle.Format = «c»
‘ display nulls as ‘NA’
Me.dgv.DefaultCellStyle.NullValue = «NA»
End Sub
Tip 14 – Change the order of columns in the DataGridView
In order to change the order of columns, just set the DisplayIndex property of the DataGridView to the desired value. Remember that the index is zero based.
C#
private void btnReorder_Click(object sender, EventArgs e)
{
dgv.Columns[«CustomerID»].DisplayIndex = 5;
dgv.Columns[«OrderID»].DisplayIndex = 3;
dgv.Columns[«EmployeeID»].DisplayIndex = 1;
dgv.Columns[«OrderDate»].DisplayIndex = 2;
dgv.Columns[«Freight»].DisplayIndex = 6;
dgv.Columns[«ShipCountry»].DisplayIndex = 0;
dgv.Columns[«ShipName»].DisplayIndex = 4;
}
VB.NET
Private Sub btnReorder_Click(ByVal sender As Object, ByVal e As EventArgs)
dgv.Columns(«CustomerID»).DisplayIndex = 5
dgv.Columns(«OrderID»).DisplayIndex = 3
dgv.Columns(«EmployeeID»).DisplayIndex = 1
dgv.Columns(«OrderDate»).DisplayIndex = 2
dgv.Columns(«Freight»).DisplayIndex = 6
dgv.Columns(«ShipCountry»).DisplayIndex = 0
dgv.Columns(«ShipName»).DisplayIndex = 4
End Sub
I hope this article was useful and I thank you for viewing it.
This article has been editorially reviewed by Suprotim Agarwal.
C# and .NET have been around for a very long time, but their constant growth means there’s always more to learn.
We at DotNetCurry are very excited to announce The Absolutely Awesome Book on C# and .NET. This is a 500 pages concise technical eBook available in PDF, ePub (iPad), and Mobi (Kindle).
Organized around concepts, this Book aims to provide a concise, yet solid foundation in C# and .NET, covering C# 6.0, C# 7.0 and .NET Core, with chapters on the latest .NET Core 3.0, .NET Standard and C# 8.0 (final release) too. Use these concepts to deepen your existing knowledge of C# and .NET, to have a solid grasp of the latest in C# and .NET OR to crack your next .NET Interview.
Click here to Explore the Table of Contents or Download Sample Chapters!
Suprotim Agarwal, MCSD, MCAD, MCDBA, MCSE, is the founder of DotNetCurry, DNC Magazine for Developers, SQLServerCurry and DevCurry. He has also authored a couple of books 51 Recipes using jQuery with ASP.NET Controls and The Absolutely Awesome jQuery CookBook.
Suprotim has received the prestigious Microsoft MVP award for Sixteen consecutive years. In a professional capacity, he is the CEO of A2Z Knowledge Visuals Pvt Ltd, a digital group that offers Digital Marketing and Branding services to businesses, both in a start-up and enterprise environment.
Get in touch with him on Twitter @suprotimagarwal or at LinkedIn