控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

Spread For WinForm多列ComboBox

作者:佚名 出处:互联网 2010年04月12日 阅读:

控件中国网是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表格控件下载

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统