In .NET 1.0, the DataGrid control was the primary Windows Forms control for presenting tabular data. Even though that control had a lot of capability and could present basic tabular data well, it was fairly difficult to customize many aspects of the control. Additionally, the DataGrid control didn’t expose enough information to the programmer about the user interactions with the grid and changes occurring in the grid due to programmatic modifications of the data or formatting. Due to these factors and a large number of new features that customers requested, the Windows Client team at Microsoft decided to introduce a replacement control for the DataGrid in .NET 2.0. That new control, the DataGridView control, is the focus of this chapter.

This chapter is from the book

THE PRECEDING CHAPTERS showed many detailed examples of data binding to simple bound controls and list bound controls. However, one of the most
common ways of presenting data is in tabular form. Users are able to quickly scan and understand large amounts of data visually
when it is presented in a table. In addition, users can interact with that data in a number of ways, including scrolling through
the data, sorting the data based on columns, editing the data directly in the grid, and selecting columns, rows, or cells.
In .NET 1.0, the DataGrid control was the primary Windows Forms control for presenting tabular data. Even though that control had a lot of capability
and could present basic tabular data well, it was fairly difficult to customize many aspects of the control. Additionally,
the DataGrid control didn’t expose enough information to the programmer about the user interactions with the grid and changes occurring
in the grid due to programmatic modifications of the data or formatting. Due to these factors and a large number of new features
that customers requested, the Windows Client team at Microsoft decided to introduce a replacement control for the DataGrid in .NET 2.0. That new control, the DataGridView control, is the focus of this chapter.

DataGridView Overview

The DataGridView control is a very powerful, flexible, and yet easy-to-use control for presenting tabular data. It is far more capable than
the DataGrid control and is easier to customize and interact with. You can let the grid do all the work of presenting data in tabular
form by setting the data-binding properties on the control appropriately. You can also take explicit control of presenting
data in the grid through the new features of unbound columns and virtual mode. Unbound columns let you formulate the contents of the cell as the cells are being added to the grid. Virtual mode gives you a higher degree of control by allowing you to wait until a cell is actually being displayed to provide the value
it will contain.

You can make the grid act like a spreadsheet, so that the focus for interaction and presentation is at the cell level instead
of at the row or column level. You can control the formatting and layout of the grid with fine-grained precision simply by
setting a few properties on the control. Finally, you can plug in a number of predefined column and cell control types, or
provide your own custom controls, and you can even mix different control types within different cells in the same row or column.

Figure 6.1 shows an example of a DataGridView control in action with some of the key visual features highlighted. You can see that the grid picks up the visual styles
of Windows XP; they are much like many of the Windows Forms controls in .NET 2.0. The grid is composed of columns and rows,
and the intersection of a column and a row is a cell. The cell is the basic unit of presentation within the grid, and is highly
customizable in appearance and behavior through the properties and events exposed by the grid. There are header cells for the rows and columns
that can be used to maintain the context of the data presented in the grid. These header cells can contain graphical glyphs
to indicate different modes or functions of the grid, such as sorting, editing, new rows, and selection. The grid can contain
cells of many different types, and can even mix different cell types in the same column if the grid isn’t data bound.