Spread For .net WinForm中如何实现多列的ComboBox

 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的宽度等。
        全部源代码在如下的链接中可以找到,使用方法也非常简单,使用的代码如下:
        Dim CboCellTypeASample As New ComboBoxCellTypeA
        CboCellTypeASample.ColumnCount = 2
        CboCellTypeASample.Items = "0#,3#HELLOWORLD"
       FpSpread1_Sheet1.Cells(1, 0).CellType = CboCellTypeASample
       源代码
 
注:
测试环境: WindowXP SP2
                 ForPoint Spread For WinForm 1.06
                 OFFICE 2003
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值