根据提供的文件信息,我们可以分析出该段代码是用于实现一个特定功能:即在.NET框架下创建一个自定义的DataGridView列,专门用来展示货币类型的数值。接下来,我们将详细解析这一功能的具体实现过程及其背后的设计思想。 ### 一、自定义DataGridViewCurrencyColumn类 此部分主要介绍`DataGridViewCurrencyColumn`类的实现细节,它继承自`DataGridViewColumn`,并实现了对货币类型数据的显示和格式化。 #### 实现细节 1. **构造函数**:通过调用基类的构造函数,并传入一个新的`DataGridViewCurrencyCell`实例来初始化`DataGridViewCurrencyColumn`对象。这表明此类中的每个单元格都是由`DataGridViewCurrencyCell`负责管理的。 ```vbnet Public Sub New() MyBase.New(New DataGridViewCurrencyCell()) Resizable = DataGridViewTriState.False Width = 120 End Sub ``` 2. **属性Resizable**:此属性被设置为不可调整大小,以确保用户无法改变列宽,从而保持货币值的稳定显示格式。 ```vbnet Public NotOverridable Overrides Property Resizable() As DataGridViewTriState Get Return MyBase.Resizable End Get Set(value As DataGridViewTriState) MyBase.Resizable = value End Set End Property ``` ### 二、自定义DataGridViewCurrencyCell类 这部分详细介绍了`DataGridViewCurrencyCell`类,它是用于存储和显示货币数值的核心组件。 #### 实现细节 1. **ValueType属性**:此属性指定了单元格中存储的数据类型为`Decimal`,这是处理货币数值的理想选择,因为它可以精确地表示小数点后的数字。 ```vbnet Public Overrides ReadOnly Property ValueType() As Type Get Return GetType(Decimal) End Get End Property ``` 2. **Paint方法**:此方法重写了父类的Paint方法,用于自定义单元格的绘制逻辑。具体包括: - 背景颜色:根据当前单元格的状态(是否选中)来决定背景色。 - 边框绘制:如果`paintParts`包含`Border`部分,则绘制边框。 - 数值格式化:将货币数值转换为字符串形式,其中整数部分和小数部分分别进行处理。 - 整数部分:使用`Math.Truncate()`函数获取。 - 小数部分:通过乘以100取模运算得到。 ```vbnet Protected Overrides Sub Paint(graphics As Graphics, clipBounds As Rectangle, cellBounds As Rectangle, rowIndex As Integer, cellState As DataGridViewElementStates, value As Object, _ formattedValue As Object, errorText As String, cellStyle As DataGridViewCellStyle, advancedBorderStyle As DataGridViewAdvancedBorderStyle, paintParts As DataGridViewPaintParts) ' 背景颜色 Dim clr_background As Color = If((cellState And DataGridViewElementStates.Selected) <> DataGridViewElementStates.Selected, cellStyle.BackColor, cellStyle.SelectionBackColor) Using bru As Brush = New SolidBrush(clr_background) graphics.FillRectangle(bru, cellBounds) End Using ' 边框绘制 If (paintParts And DataGridViewPaintParts.Border) <> 0 Then PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle) End If ' 分隔线绘制 For i As Integer = 1 To 9 graphics.DrawLine(Pens.DarkCyan, cellBounds.Left + i * P_WIDTH, cellBounds.Top, cellBounds.Left + i * P_WIDTH, cellBounds.Bottom - 1) Next graphics.DrawLine(Pens.Red, cellBounds.Left + 10 * P_WIDTH, cellBounds.Top, cellBounds.Left + 10 * P_WIDTH, cellBounds.Bottom - 1) graphics.DrawLine(Pens.DarkCyan, cellBounds.Left + 11 * P_WIDTH, cellBounds.Top, cellBounds.Left + 11 * P_WIDTH, cellBounds.Bottom - 1) ' 数值格式化 If value Is Nothing Then Return End If Dim sf = New StringFormat With { _ .Alignment = StringAlignment.Center, _ .LineAlignment = StringAlignment.Center _ } Dim v As Decimal = Convert.ToDecimal(value) Dim s_intAsString = CInt(Math.Truncate(v)).ToString() ' 小数部分 Dim s_decAsString = (v * 100 Mod 100).ToString("00") Dim s_valueAsString = "$" & s_intAsString & "." & s_decAsString ' 绘制数值 graphics.DrawString(s_valueAsString, cellStyle.Font, Brushes.Black, cellBounds, sf) End Sub ``` 这段代码通过自定义`DataGridViewCurrencyColumn`和`DataGridViewCurrencyCell`类,实现了对货币类型数据的高效管理和格式化显示。这对于财务软件或其他需要精确展示货币数值的应用来说非常有用。
Public Class DataGridViewCurrencyColumn
Inherits DataGridViewColumn
Public Sub New()
MyBase.New(New DataGridViewCurrencyCell())
Resizable = DataGridViewTriState.[False]
'固定宽度
Width = 120
End Sub
Public NotOverridable Overrides Property Resizable() As DataGridViewTriState
Get
Return MyBase.Resizable
End Get
Set(value As DataGridViewTriState)
MyBase.Resizable = value
End Set
End Property
End Class
Public Class DataGridViewCurrencyCell
Inherits DataGridViewTextBoxCell
'每一位数字的宽度
Private Const P_WIDTH As Integer = 10
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(Decimal)
End Get
End Property
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助