对于其他数据,我将通过添加一个附加列将您要显示的数据添加到数据表中。这使得它更容易在网格中使用。
为了显示列的子集,我建议您手动创建要查看的列,并忽略不想看到的列或将 visibile 设置为 false。后者的优点是您可以让程序员或稍加努力的用户选择要查看的列。
一些示例代码,用简单的地址数据填充网格,因为我没有足够的信息来处理您的数据定义:
手动创建表格
var table = new DataTable {TableName = "AddressData"};
// Declare DataColumn and DataRow variables.
// Create new DataColumns, set DataType, ColumnName and add to DataTable.
// Create Addressee column.
var column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Addressee" };
table.Columns.Add(column);
// Create Address1 column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Address1" };
table.Columns.Add(column);
// Create Address2 column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Address2" };
table.Columns.Add(column);
// Create CityOrTown column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "CityOrTown" };
table.Columns.Add(column);
// Create Country column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Country" };
table.Columns.Add(column);
// Create CountryId column.
column = new DataColumn { DataType = Type.GetType("System.Int64"), ColumnName = "CountryId" };
table.Columns.Add(column);
// Create CountyOrState column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "CountyOrState" };
table.Columns.Add(column);
// Create Postcode column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "Postcode" };
table.Columns.Add(column);
// Create Formatted Address column.
column = new DataColumn { DataType = Type.GetType("System.String"), ColumnName = "FormattedAddress" };
table.Columns.Add(column);
创建表格后,您可以随意填充它。或者,您可以简单地从数据库中返回包含计算列的表。
手动创建列
private void Prepare()
{
// Set up the grid
AutoGenerateColumns = false;
Columns.Clear();
AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
var column = new DataGridViewTextBoxColumn
{
AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
DataPropertyName = "Addressee",
DefaultCellStyle = CellStyles.Text,
HeaderText = @"Addressee",
Name = "AddresseeColumn",
};
Columns.Add(column);
// more columns added here to suit
// Add invisible Id column
var idColumn = new DataGridViewTextBoxColumn
{
DataPropertyName = "CountryId",
Name = "CountryIdColumn",
HeaderText = @"Id",
Width = 0,
Visible = false
};
Columns.Add(idColumn);
}
将每列的 DataPropertyName 设置为您希望在表中显示的列名。 AutoSize 设置会导致网格中的任何空闲空间自动分配给具有该设置的列。如果您将其设置在多个列上,它们会自动调整,例如如果您有 90 像素的备用空间和 AutoSize 设置为 Fill 的三列,则每列将添加 30 像素。
请注意,您也可以从任何 Enumerable 对象中使用完全相同的技术,例如自定义数据对象的列表或数组。在上面的示例地址中,您可以使用地址列表而不是数据表来填充网格。
如果您采用该选项,您可以在对象中包含计算的值并避免创建表的工作。如果您已经有合适的对象并从数据库中填充它们,这将非常有用。
你有很多选择!