DataGrid Table Styles
The Windows Form DataGrid control displays data in the form of a grid. The
DataGridTableStyle is a class that represents the drawn grid only. This
grid should not be confused with the DataTable class, which is a possible source
of data for the grid. Instead, the DataGridTableStyle strictly represents the grid as
it is painted in the control. Therefore, through the DataGridTableStyle you can
control the appearance of the grid for each DataTable. To specify which
DataGridTableStyle is used when displaying data from a particular DataTable, set the
MappingName to the TableName of a DataTable.
The GridTableStylesCollection contains all the DataGridTableStyle objects used by a
System.Windows.Forms.DataGrid control. The collection can contain as many
DataGridTableStyle objects as you need, however the MappingName of each must be
unique. At run time, this allows you to substitute a different DataGridTableStyle for
the same data, depending on the user's preference.
DataGrid Column Styles
The DataGrid control automatically creates a collection of
DataGridColumnStyle objects for you when you set the DataSource property to an
appropriate data source. The objects created actually are instances of one of the
following classes that inherit from DataGridColumnStyle: DataGridBoolColumn or
DataGridTextBoxColumn class.
You can also create your own set of DataGridColumnStyle objects and add them to
the GridColumnStylesCollection. When you do so, you must set the MappingName of each
column style to the ColumnName of a DataColumn to synchronize the display of columns
with the actual data.
Example
The following example creates two Table Styles. one for the
customer table, the other for the orders table. Then the own Column Styles
are used to format the columns.
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using System.Data.SqlClient;
public class CustomGridStyles : System.Windows.Forms.Form
{
private Button btnShowOrders;
private DataGrid myDataGrid;
private DataSet myDataSet;
private Button btnShowCustomers;
private bool TablesAlreadyAdded;
public CustomGridStyles()
{
InitializeComponent();
// Get Customers and Orders from the
Database
MakeDataSet();
// Show the Customers Table withot
custom Table Style
myDataGrid.DataSource = myDataSet.Tables["Customers"];
}
....
....
public static void Main()
{
Application.Run(new CustomGridStyles());
}
// Show Orders Table with custom Table/Column
Style
protected void btnShowOrders_Click(object sender, System.EventArgs e)
{
if (!TablesAlreadyAdded)
{
AddCustomDataTableStyle();
}
myDataGrid.SetDataBinding(myDataSet, "Orders");
myDataGrid.CaptionText = "Formatted Orders Table";
}
// Show Customers Table with custom Table/Column
Style
private void btnShowCustomers_Click(object sender, System.EventArgs
e)
{
if (!TablesAlreadyAdded)
{
AddCustomDataTableStyle();
}
myDataGrid.SetDataBinding(myDataSet, "Customers");
myDataGrid.CaptionText = "Formatted Customers Table";
}
// Create own Table/Column Styles
private void AddCustomDataTableStyle()
{
// Create the first
DataGridTableStyle which is used
// for the "Customers" Table
DataGridTableStyle ts1 = new DataGridTableStyle();
ts1.MappingName = "Customers";
// Set other properties.
ts1.AlternatingBackColor = Color.LightBlue;
// Create a first column style and
set its MappingName
// to the "CustomerID" column of the "Customers"
Table.
// Set the HeaderText and Width properties. Well I
know
// for the "CustomerID" Column it makes not much sense
to
// set a DataGridBoolColumn ... it's just a
Demo.
DataGridColumnStyle boolCol = new
DataGridBoolColumn();
boolCol.MappingName = "CustomerID";
boolCol.HeaderText = "ID";
boolCol.Width = 50;
ts1.GridColumnStyles.Add(boolCol);
// Add a second column style and set its
MappingName
// to the "CompanyName" column of the "Customers"
Table.
DataGridColumnStyle TextCol = new
DataGridTextBoxColumn();
TextCol.MappingName = "CompanyName";
TextCol.HeaderText = "Company";
TextCol.Width = 250;
ts1.GridColumnStyles.Add(TextCol);
// Create the second DataGridTableStyle
which is used
// for the "Orders" Table.
DataGridTableStyle ts2 = new DataGridTableStyle();
ts2.MappingName = "Orders";
// Set other properties.
ts2.AlternatingBackColor = Color.LightGray;
// Use a PropertyDescriptor to
create a formatted
// column. First get the PropertyDescriptorCollection
// for the data source and data member
PropertyDescriptorCollection pcol =
this.BindingContext
[myDataSet,"Orders"].GetItemProperties();
// Create a first formatted column style
and set its MappingName
// to the OrderDate" column of the "Orders" Table.
// Format the DateTime as Long Format "F"
DataGridColumnStyle cOrderDate =
new
DataGridTextBoxColumn(pcol["OrderDate"], "F", true);
cOrderDate.MappingName = "OrderDate";
cOrderDate.HeaderText = "Formatted Order Date";
cOrderDate.Width = 200;
ts2.GridColumnStyles.Add(cOrderDate);
// Create a second formatted column
using a PropertyDescriptor.
// The formatting character "c" specifies a currency
format.
DataGridColumnStyle csOrderFreight =
new
DataGridTextBoxColumn(pcol["Freight"], "c", true);
csOrderFreight.MappingName = "Freight";
csOrderFreight.HeaderText = "Formatted Freight";
csOrderFreight.Width = 100;
ts2.GridColumnStyles.Add(csOrderFreight);
// Add the DataGridTableStyle
instances to
// the GridTableStylesCollection
myDataGrid.TableStyles.Add(ts1);
myDataGrid.TableStyles.Add(ts2);
// Sets the TablesAlreadyAdded to
true so this doesn't happen again.
TablesAlreadyAdded = true;
}
// Create a DataSet with two tables and populate
it.
private void MakeDataSet()
{
// Setup DB-Connection
string ConnectionString = "data
source=xeon;uid=sa;password=manager;database=northwind";
SqlConnection cn = new
SqlConnection(ConnectionString);
// Create the DataSet
myDataSet = new DataSet("CustOrders");
// Fill the Dataset with Customers,
map Default Tablename
// "Table" to "Customers".
SqlDataAdapter da1 = new SqlDataAdapter("SELECT * FROM
Customers",cn);
da1.TableMappings.Add("Table","Customers");
da1.Fill(myDataSet);
// Fill the Dataset with Orders, map
Default Tablename
// "Table" to "Orders".
SqlDataAdapter da2 = new SqlDataAdapter("SELECT * FROM
Orders",cn);
da2.TableMappings.Add("Table","Orders");
da2.Fill(myDataSet);
}
}
|