DataGridView简介1 - asp.net 教程-
时间:2010-08-27 来源:星空3
本页内容
|
基本数据绑定 |
|
美化 DataGridView |
|
使用 DataGridView 选择单元格 |
|
DataGridView 对象 |
|
DataGridView 样式 |
|
自定义单元格格式 |
|
按钮列 |
|
图像列 |
|
编辑 DataGridView |
|
处理错误 |
|
验证输入 |
|
使用列表列约束选择 |
|
小结 |
基本数据绑定
熟悉 DataGridView 的最佳方法就是实际尝试一下,无需配置任何属性。就像 DataGrid 一样,您可以使用 DataSource 属性来绑定 DataTable 对象(或从 DataTable 派生的对象)。
Dim ds As DataSet = GetDataSet()
DataGridView1.DataSource = ds.Tables("Customers")
与 DataGrid 不同的是,DataGridView 一次只能显示一个表。如果绑定整个 DataSet,则不会显示任何数据,除非您使用要显示的表名设置了 DataMember 属性。
DataGridView1.DataSource = ds
DataGridView1.DataMember = "Customers"
基本的 DataGridView 显示遵循以下几项简单的规则:
• |
为数据源中的每个字段创建一列。 |
• |
使用字段名称创建列标题。列标题是固定的,这意味着用户在列表中向下移动时列标题不会滚动出视图。 |
• |
支持 Windows XP 视觉样式。您会注意到列标题具有新式的平面外观,并且当用户将鼠标移到其上时会突出显示。 |
DataGridView 还包括几个您可能不会立即注意到的默认行为:
• |
允许就地编辑。用户可以在单元格中双击或按 F2 来修改当前值。唯一的例外是将 DataColumn.ReadOnly 设置为 True 的字段(如当前示例中的 OrderID 字段)。 |
• |
支持自动排序。用户可以在列标题中单击一次或两次,基于该字段中的值按升序或降序对值进行排序。默认情况下,排序时会考虑数据类型并按字母或数字顺序进行排序。字母顺序区分大小写。 |
• |
允许不同类型的选择。用户可以通过单击并拖动来突出显示一个单元格、多个单元格或多个行。单击 DataGridView 左上角的方块可以选择整个表。 |
• |
支持自动调整大小功能。用户可以在标题之间的列分隔符上双击,使左边的列自动按照单元格的内容展开或收缩。 |
美化 DataGridView
DataGridView 的默认外观仅仅比 DataGrid 略有改进,但是使用几项快速调整功能,您可以将其显著改进。
其中的一个问题就是列无法自动展开以适合其包含的数据。您可以使用 DataGridView.AutoSizeColumns() 方法以及 DataGridViewAutoSizeColumnCriteria 枚举中的某个值来解决此问题。您可以选择根据标题文本、当前显示的行或表中的所有行的的宽度来调整列宽。
' 根据标题或此列的某一行中
' 最长一段文本的宽度调整
' 列宽。
DataGridView1.AutoSizeColumns( _
DataGridViewAutoSizeColumnCriteria.HeaderAndRows)
请记住,此方法必须在绑定数据后调用,否则不会产生任何效果。你可能还需要在用户编辑数据后使用它(可能在响应 DataGridView.CellValueChanged 等事件时)。
如果不增加列宽,则可以更改行高。默认情况下,列中的文本会跨越多行。如果您使用 DataGridView.AutoSizeRows() 方法,则行会根据其中的内容调整高度。使用此方法前,您可能希望增加列宽,尤其是在字段包含大量文本时。例如,以下代码片段使“说明”列的列宽增加为原列宽的四倍,然后调整行高以容纳其内容。
DataGridView.Columns("Description").Width *= 4
DataGridView.AutoSizeRows( _
DataGridViewAutoSizeRowsMode.HeaderAndColumnsAllRows)
图 1 比较了自动调整 DataGridView 大小的各种方法。
另一个合理的更改是清理每一列中显示的标题文本。例如,标题“Order Date”比字段名称“OrderDate”看上去更为专业。这项更改很容易进行。您只需从 DataGridView.Columns 集合中检索相应的 DataGridViewColumn,并修改其 HeaderText 属性:
DataGridView.Columns("OrderID").HeaderText = "Order ID"
使用 DataGridView 选择单元格
默认情况下,DataGridView 允许自由选择。用户可以突出显示单元格或单元格组,可以一次突出显示所有单元格(通过单击网格右上角的方块),还可以突出显示一行或多行(通过在行标题列中单击)。根据选择模式,用户甚至能够通过选择列标题来选择一列或多列。通过使用 DataGridViewSelectionMode 枚举中的某个值来设置 DataGridView.SelectionMode 属性,可以控制此行为,如下所述:
• |
CellSelect:用户可以选择单元格,但不能选择整个行或标题。如果 DataGridView.MultiSelect 为 True,则用户可以选择多个单元格。 |
• |
FullColumnSelect:单击列标题只能选择整个列。如果 DataGridView.MultiSelect 为 True,则用户可以选择多个列。使用此模式时,单击列标题不会对网格进行排序。 |
• |
FullRowSelect:单击行标题只能选择整个行。如果 DataGridView.MultiSelect 为 True,则用户可以选择多个行。 |
• |
ColumnHeaderSelect:用户可以使用 CellSelect 或 FullColumnSelect 选择模式。使用此模式时,单击列标题不会对网格进行排序。 |
• |
RowHeaderSelect:用户可以使用 CellSelect 或 FullRowSelect 选择模式。这是默认的选择模式。 |
通过 DataGridView,可以使用以下三个属性方便地检索选定的单元格:SelectedCells、SelectedRows 和 SelectedColumns。无论使用的是哪种选择模式,SelectedCells 都始终返回 DataGridViewCell 对象的集合。另一方面,如果使用行标题选择了整个行,则 SelectedRows 只返回信息,而如果使用列标题选择了整个列,则 SelectedColumns 也只返回信息。
例如,以下代码片段将检查选定的整个行。只要找到一行,它就会在消息框中显示 CustomerID 列中的相应值:
For Each SelectedRow As DataGridViewRow In _
DataGridView1.SelectedRows
MessageBox.Show( _
SelectedRow.Cells("CustomerID").Value)
Next
使用 CurrentCell 或 CurrentCellAddress 属性检索对当前单元格的引用也同样简单。使用 DataGridView 时,您会注意到当前单元格被一个矩形围住,看起来像是一个用黑色虚线绘制的方框。这就是用户当前所在的位置。
CurrentCellAddress 属性是只读的,但是您可以使用 CurrentCell 以编程方式更改当前位置。完成此操作后,DataGridView 将被滚动以使当前位置可见。
' 移至第十一行的第四个单元格。
DataGridView.CurrentCell = _
DataGridView.Rows(10).Cells(3)
DataGridView 对象
到目前为止,您已经了解了如何与当前选定的一组行、单元格和列进行交互。DataGridView 提供了两个关键集合,用于处理整个数据集。这两个集合分别是 Columns(DataGridViewColumn 对象的集合)和 Rows(DataGridViewRow 对象的集合,每个对象都引用一组 DataGridViewCell 对象的集合)。图 2 显示了对象模型。
一般而言,您将使用 DataGridViewColumn 对象来配置列显示属性、格式设置及标题文本,而使用 DataGridViewRow 和 DataGridViewCell 对象从绑定的记录中检索实际数据。在 DataGridViewCell 中修改数据时,处理方式与用户编辑的方式相同:引发相应的 DataGridView 更改事件,并且修改底层的 DataTable。
现在您已经了解了 DataGridView 对象模型,因此可以轻松地创建遍历该表的代码。要选择行、列或单元格,只需找到对应的 DataGridViewRow、DataGridViewColumn 或 DataGridViewCell 对象,并将 IsSelected 属性设置为 True。
以下示例以编程方式选择 OrderID 字段的值小于 100 的所有行:
For Each Row As DataGridViewRow In DataGridView1.Rows
If Row.Cells("OrderID").Value < 100 Then
Row.Selected = True
End If
Next
值得一提的是,有几个从 DataGridViewColumn 派生的不同的类。这些类可以控制在单元格中显示和编辑值的方式。.NET 包括五个预先创建的 DataGridView 列类:DataGridViewButtonColumn、DataGridViewCheckBoxColumn、DataGridViewComboBoxColumn、DataGridViewImageColumn 和 DataGridViewTextBoxColumn。
DataGridView 样式
设计 DataGridView 时面临的挑战之一就是创建一个格式设置系统,该系统要能够足够灵活地应用不同级别的格式设置,而对于非常大的表又要保持高效。从灵活性角度来看,最好的方法是允许开发人员分别配置每个单元格。但是从效率角度来看,这种方法可能是有害的。包含数千行的表中具有好几万个单元格,维护每个单元格的不同格式肯定会浪费很多内存。
为解决此问题,DataGridView 通过 DataGridViewCellStyle 对象来实现多层模型。DataGridViewCellStyle 对象表示单元格的样式,并且包括如颜色、字体、对齐、换行和数据格式等详细信息。您可以创建一个 DataGridViewCellStyle 来指定整个表的默认格式。此外,还可以指定列、行和各个单元格的默认格式。格式设置的越细致、创建的 DataGridViewCellStyle 对象越多,该解决方案的可伸缩性也就越小。但是,如果您主要使用基于列和基于行的格式设置,并且只是偶尔设置各个单元格的格式,则与 DataGrid 相比,DataGridView 不需要太多内存。
DataGridView 应用格式设置时,将遵循以下优先顺序(从最高到最低):
1. DataGridViewCell.Style
2. DataGridViewRow.DefaultCellStyle
3. DataGridView.AlternatingRowsDefaultCellStyle
4. DataGridView.RowsDefaultCellStyle
5. DataGridViewColumn.DefaultCellStyle
6. DataGridView.DefaultCellStyle
重要的是要清楚:样式对象不是以“全有/全无”的方式应用的,DataGridView 会检查每个属性。例如,假设您的单元格使用 DataGridViewCell.Style 属性来应用自定义字体,但没有设置自定义前景色。结果,该字体设置将覆盖任何其他样式对象中的字体信息,但如果层次结构中下一个样式对象的前景色不为空,则将从该对象继承前景色(在这种情况下为 DataGridViewRow.DefaultCellStyle)。
DataGridViewCellStyle 定义了两种格式设置:数据和外观。数据格式设置描述显示数据绑定值之前如何对其进行修改。这种格式设置通常包括使用格式设置字符串将数字或日期值转换为文本。要使用数据格式设置,只需使用 DataGridViewCellStyle.Format 属性设置格式定义或自定义格式字符串即可。
例如,以下代码片段对 UnitCost 字段中的所有数字进行格式设置,以将它们显示为货币值,保留两位小数并加上在区域设置中定义的相应货币符号:
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.Format = "C"
外观格式设置包括颜色和格式等表面细节。例如,以下代码右对齐 UnitCost 字段、应用粗体并将单元格的背景更改为黄色:
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.Font = _
New Font(DataGridView.Font, FontStyle.Bold)
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleRight
DataGridView1.Columns("UnitCost"). _
DefaultCellStyle.BackColor = Color.LightYellow
其他与格式设置相关的属性包括 ForeColor、SelectionForeColor、SelectionBackColor、WrapMode(控制文本在空间允许时是跨越多行还是直接截断)及 NullValue(将替代 Null 值的值)。
DataGridView 还包括一个设计器,用于在设计时配置列样式。只需从“Properties”(属性)窗口中选择“DataGridView Properties”(DataGridView 属性)链接,或者从各种预先创建的样式设置中选择“AutoFormat”(自动套用格式)。