【发布时间】:2017-07-21 08:26:08
【问题描述】:
我为 DataGridView 定义了一个自定义列,以十六进制显示值。它所做的只是格式化文本并指定字体。
(由于 VB.NET 中的历史原因 :-))
Public Class clsDgvHexColumn
Inherits DataGridViewTextBoxColumn
Private mFont As System.Drawing.Font
public sub New
MyBase.CellTemplate = new clsDgvHexColumnCell
mFont = New System.Drawing.Font ( "Consolas", 10 )
End Sub
Public Property Font As Font
Get
Return mFont
End Get
Set(ByVal value As Font)
mFont = value
Me.DefaultCellStyle.Font = mFont
End Set
End Property
End Class
Public Class clsDgvHexColumnCell
Inherits DataGridViewTextBoxCell
Protected Overrides Function GetFormattedValue ( ByVal value As Object, _
ByVal rowIndex As Integer, _
ByRef cellStyle As System.Windows.Forms.DataGridViewCellStyle, _
ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _
ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, _
ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts ) As Object
Return String.Format ( "0x{0:X4}", value )
End Function
End Class
为了处理输入,我为网格上的 CellParsing 事件定义了一个处理程序。
Private Sub dgvValues_CellParsing(sender As Object, e As DataGridViewCellParsingEventArgs) Handles dgvValues.CellParsing
If dgvValues.Columns(e.ColumnIndex).Name = "NewDAC" _
OrElse dgvValues.Columns(e.ColumnIndex).Name = "NewOffset" _
OrElse dgvValues.Columns(e.ColumnIndex).Name = "New80PercentValue" _
Then
If e IsNot Nothing AndAlso e.Value IsNot Nothing Then
Try
Dim InputString As String = TryCast(e.Value, String)
Dim newValue As Int32 = TypeDescriptor.GetConverter(newValue).ConvertFrom(InputString)
Dim bytes As Byte() = BitConverter.GetBytes(newValue)
If e.DesiredType.Equals(GetType(UInt16)) Then
e.Value = BitConverter.ToUInt16 ( bytes, 0 )
ElseIf e.DesiredType.Equals(GetType(Int16)) Then
e.Value = BitConverter.ToInt16 ( bytes, 0 )
ElseIf e.DesiredType.Equals(GetType(UInt32)) Then
e.Value = BitConverter.ToUInt32 ( bytes, 0 )
ElseIf e.DesiredType.Equals(GetType(Int32)) Then
e.Value = newValue
End If
e.ParsingApplied = True
Catch
End Try
End If
End If
End Sub
这基本上是可行的,但我更喜欢将单元格解析逻辑完全封装在自定义列中。
这样我可以只选择列类型,一切都会正常工作,而无需在包含网格的表单中进行任何特殊处理。
有没有办法在自定义列(或单元格)类中处理 CellParsing?
【问题讨论】:
-
我认为这就是解决方案。有没有办法获取绑定数据的类型(Int16、UInt16、Int32、UInt32)?如果没有,我可能会创建单独的列类型,HexColumnInt16、HexColumnUInt16、HexColumnInt32 和 HexColumnUInt32。
-
ValueType属性(至少这是默认实现使用的:) -
谢谢,这行得通。
标签: c# .net vb.net winforms datagridview