Formatting the .NET 1.x DataGrid ranges from awkward to nearly impossible. However, thanks to its multi-layered model, formatting the DataGridView is far easier. This model builds on a single class, the DataGridViewCellStyle, which encapsulates key formatting properties. You can assign different DataGridViewCellStyle objects to separate rows, columns, or even distinct cells.
Note: By using a few simple style properties, you can configure the appearance of the entire grid, individual columns, or rows with important data.
The DataGridView already looks better than the DataGrid in its default state. For example, you''ll notice that the column headers have a modern, flat look and become highlighted when the user moves the mouse over them. However, there''s much more you can do with the help of the DataGridViewCellStyle class.
The DataGridViewCellStyle collects all the formatting properties of the DataGridView. It defines appearance-related settings (e.g., color, font), and data formatting (e.g., currency, date formats). All in all, the DataGridViewCellStyle provides the following key properties:
Alignment
Sets how text is justified inside the cell.
BackColor and ForeColor
Set the color of the cell background and the color of the cell text.
Font
Sets the font used for the cell text.
Format
A format string that configures how numeric or date data values will be formatted as strings. You can use the standard .NET format specifiers and your own custom format strings. For example, C designates a currency value. (For more information, look up the index entry "numeric format strings" in the MSDN help.)
NullText
A string of text that will be substituted for any null (missing) values.
SelectionBackColor and SelectionForeColor
Set the cell background colors and text colors for selected cells.
WrapMode
Determines if text will flow over multiple lines (if the row is high enough to accommodate it) or if it will be truncated. By default, cells will wrap.
The interesting part is that you can create and set DataGridViewCellStyle objects at different levels. When the DataGridView displays a cell, it looks for style information in several places. Here''s the order from highest to lowest importance:
DataGridViewCell.Style
DataGridViewRow.DefaultCellStyle
DataGridView.AlternatingRowsDefaultCellStyle
DataGridView.RowsDefaultCellStyle
DataGridViewColumn.DefaultCellStyle
DataGridView.DefaultCellStyle
In other words, if DataGridView finds a DataGridViewCellStyle object assigned to the current cell (option 1), it always uses it. If not, it checks the DataGridViewCellStyle for the row, and so on.
The following code snippet performs column-specific formatting. It ensures that all the values in the CustomerID column are given a different font, alignment, and set of colors. Figure 3-13 shows the result.
Note: If you use the design-time data-binding features of Visual Studio, you can avoid writing this code altogether. Just click the Edit Columns link in the Properties Window and use the designer to choose the formatting.
Dim Style As DataGridViewCellStyle = _
DataGridView1.Columns("CustomerID").DefaultCellStyle
Style.Font = New Font(DataGridView1.Font, FontStyle.Bold)
Style.Alignment = DataGridViewContentAlignment.MiddleRight
Style.BackColor = Color.LightYellow
Style.ForeColor = Color.DarkRed
...the easiest way to apply custom cell formatting? Sometimes, you want to call attention to cells with certain values. You could handle this task by iterating over the entire grid, looking for those cells that interest you. However, you can save time by responding to the DataGridView.CellFormatting event. This event occurs as the grid is being filled. It gives you the chance to inspect the cell and change its style before it appears.
Here''s an example that formats a cell to highlight high prices:
Private Sub DataGridView1_CellFormatting(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _ Handles DataGridView1.CellFormatting '' Check if this is the right column. If DataGridView1.Columns(e.ColumnIndex).Name = "Price" Then '' Check if this is the right value. If e.Value > 100 Then e.CellStyle.ForeColor = Color.Red e.CellStyle.BackColor = Color.Yellow End If End If End Sub
Keep in mind that you should reuse style objects if at all possible. If you assign a new style object to each cell, you''ll consume a vast amount of memory. A better approach is to create one style object, and assign it to multiple cells that use the same formatting.