控件中国网是Spread for Windows Forms在中国的核心代理商,获取产品下载请点击:
Spread for Windows Forms表格控件下载
Spread For .net 中自带的ComboBox是普通的文本框加上一个ListBox,所以如果使用这个ComboBox是无法实现多列显示的。
那么如果需要下图所示的ComboBox需要如何实现呢?
好在Spread For .net完全采用了面向对象的方法实现,并且提供了相应的扩展可以让我们实现这种要求。这个实现的关键就是要使用CellType和Office中自带的ComboBox控件。
在开始之前我们必须要确定相关的实现方法:
首先,Office中自带的ComboBox(.net中叫做AxCombo),是可以实现多列显示的,所以如果需要多列显示的话,我们就需要采用这个控件,当然如果时间允许的话,也可以采用自定义的控件,但是一般来说自定义一个控件是比较麻烦de,如果没有必要的话,最好就使用系统自带的。
其次,Spread为了增加自身的灵活性,对单元格的控件类型使用CellType来进行定义,如:ComboBoxCellType,CheckBoxCellType等,他们都是从BaseCellType中继承而来,而单元格(cells)对象对所有的BaseCellType的扩展类都可以解释,也就是说Spread给我们提供了足够的扩展空间。
这样,我们就可以利用如上的两个特性来实现我们想要的功能。
现在,我们就来具体的实现它。
首先我们定义一个类使他从ComboBoxCellType类中继承出来。之所以选择ComboboxCellType而不是BaseCellType是因为这样我们可以节省一些代码,比如画下拉按钮等。
Public Class ComboBoxCellTypeA
Inherits FarPoint.Win.Spread.CellType.ComboBoxCellType
End Class
这样我们就有了一个基本的类,它具有ComboBoxCellType的所有行为,接下来我们就需要改变他的一些固有行为来实现我们想要的。
我们在类中定义一个AxcomboBox
Private WithEvents ComboBoxA As AxMSForms.AxComboBox
并且将其实例化
Public Sub New()
ComboBoxA = New AxMSForms.AxComboBox
End Sub
为了能够将它显示出来我们需要重载GetEditorControl方法
Public Overrides Function GetEditorControl(ByVal appearance As FarPoint.Win.Spread.Appearance, ByVal zoomFactor As Single) As System.Windows.Forms.Control
Return ComboBoxA
End Function
现在这个东西已经能够基本表示出来了,但是还是非常怪异的,我们接下来将这个类完善,
Public Overrides Function GetEditorValue() As Object
Return ComboBoxA.Text
End Function
Public Overrides Sub SetEditorValue(ByVal value As Object)
Try
If value <> "" Then ComboBoxA.Text = value
MyBase.SetEditorValue(value)
Catch ex As Exception
Console.Write("ComboBoxCellTypeA_SetEditorValue:" & ex.Message & vbCrLf)
End Try
End Sub
Public Overrides Sub PaintCell(ByVal g As System.Drawing.Graphics, ByVal r As System.Drawing.Rectangle, ByVal appearance As FarPoint.Win.Spread.Appearance, ByVal value As Object, ByVal isSelected As Boolean, ByVal isLocked As Boolean, ByVal zoomFactor As Single)
Try
MyBase.PaintCell(g, r, appearance, value, isSelected, isLocked, zoomFactor)
Catch ex As Exception
Console.Write("ComboBoxCellTypeA_PaintCell:" & ex.Message & vbCrLf)
End Try
End Sub
好的,到现在为止这个类已经具有了一个ComboBox的基本功能,能够实现下拉,并且可以表示在Cell中,但是在最开始表示的时候,还是有点不正常,而且选择之后也无法表示在当前的单元格中,这是因为paintCell方法在作怪,我们进一步完善这个方法
Public Overrides Sub PaintCell(ByVal g As System.Drawing.Graphics, ByVal r As System.Drawing.Rectangle, ByVal appearance As FarPoint.Win.Spread.Appearance, ByVal value As Object, ByVal isSelected As Boolean, ByVal isLocked As Boolean, ByVal zoomFactor As Single)
Try
MyBase.PaintCell(g, r, appearance, value, isSelected, isLocked, zoomFactor)
Dim drawFormat As New StringFormat(StringFormatFlags.NoWrap)
Dim r3 As New System.Drawing.RectangleF(r.Left, r.Top, r.Width - 18, r.Height)
If Text <> "" Then
g.DrawString(Text, IIf(ComboFont Is Nothing, New Font("Arial", 9), ComboFont), New SolidBrush(Color.Black), r3, drawFormat)
Else
g.DrawString(ComboBoxA.Text, IIf(ComboFont Is Nothing, New Font("Arial", 9), ComboFont), New SolidBrush(Color.Black), r3, drawFormat)
End If
Catch ex As Exception
Console.Write("ComboBoxCellTypeA_PaintCell:" & ex.Message & vbCrLf)
End Try
End Sub
好的,现在选择的内容可以表示了。
接下来,来定义最开始显示时的行为,我们需要重载StartEditing方法,
Static flag As Integer
MyBase.StartEditing(e, selectAll, autoClipboard)
If flag = 0 Then
flag = flag Mod 2 + 1
ComboBoxA.Left = RectangleCell.Left
ComboBoxA.Top = RectangleCell.Top
ComboBoxA.Width = RectangleCell.Width
ComboBoxA.Height = RectangleCell.Height
End If
Catch ex As Exception
Console.Write("ComboBoxCellTypeA_StartEditing:" & ex.Message & vbCrLf)
End Try
这样这个类就可以使用了,我们可以进一步去完善它,比如增加DataSoure,设施下拉List的宽度等。
控件中国网是Spread for Windows Forms在中国的核心代理商,获取产品下载请点击:
Spread for Windows Forms表格控件下载