VB.Net自己写的一个控件:ComboBox下拉列表中显示多列数据(可以绑定数据表)

最近在用VB.Net开发一个小程序时候,用到一个显示多列的ComboBox,而且从数据库中取出来的数据表要绑定到一个ComboBox中。找来找去,找不到。上Baidu Google很多人说:在VB.Net中的ComboBox只能绑定一列数据。以前的VBA和VB的ComBox可以显示多列数据的。上.Net的怎么不可以能。自己考虑到可以用一个ComboBox和一个ListView结合做一个能够显示多列内容的ComboBox下拉框,可以将一个数据表绑定到ComboBox中的用户控件。

自己就开始做,反复测试,改代码。

 

用户控件名:CmbBoxListView
控件里面有一个ComboBox和一个ListView。名称分别为:CmbBox和Lv。

 

控件的属性:
LvWidth     设置CmbBox中的List的宽度。
LvHeight    设置CmbBox中的List的高度。
IsShowColumnHeader  是否显示列标题。
IsShowRowHeader  是否显示行标题。
Text   获取或设置CmbBoxListView中的当前文本(重写基类Text)。

SelectedIndex 选中项的索引

 

控件的方法:(一个绑定数据表的方法,重载四次。)
BindDataTB(ByVal DataTB As DataTable, ByVal TBKeyWordName As String)
将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定绑定的字段的名称。

BindDataTB(ByVal DataTB As DataTable, ByVal TBKeyWordPosition As Integer)
将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定绑定的字段的位置。

BindDataTB(ByVal DataTB As DataTable, ByVal NewColumnsNameStr As String, ByVal KeyWordName As String)
将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定新的列表标题和绑定的标题的名称。新的列表标题,用 , 或 ; 分隔开的字符串。

BindDataTB(ByVal DataTB As DataTable, ByVal NewColumnsNameStr As String, ByVal KeyWordPosition As Integer)
将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定新的列表标题和绑定的标题的位置。新的列表标题,用 , 或 ; 分隔开的字符串。

 

 

使用起来很方便:
Me.CmbBoxListView1.LvWidth = 200
Me.CmbBoxListView1.LvHeight = 100
Me.CmbBoxListView1.IsShowColumnHeader = True
Me.CmbBoxListView1.IsShowRowHeader = False
Me.CmbBoxListView1.BindDataTB(Me.ADataSet.Dt, "你的;我的;他的;美的;好的", 1)
Me.TextBox1.Text = Me.CmbBoxListView1.Text

其中DataSet.Dt是一个DataSe的一个表Dt,表有5个字段名,绑定第一列为有效数据也就是控件CmbBoxListView中的当前文本Text属性。

 

------补充开始------

控件的下载地址:
http://download.csdn.net/source/954311

 

增加的一个事件,事件的使用和说明见:

http://blog.csdn.net/linjimu/archive/2009/01/09/3739537.aspx

 

------补充结束------

 

绑定效果:
VB.Net自己写的一个控件:ComboBox下拉列表中显示多列数据(可以绑定数据表)_第1张图片

 

整个控件的代码(已经添加了事件了):

  1. Public Class CmbBoxListView
  2.     Inherits UserControl
  3.     Public Delegate Sub ChangedTextEvent(ByVal sender As ObjectByVal e As EventArgs)
  4.     Public Event SelectTextChanged As ChangedTextEvent
  5.     Const CtrlHeight As Integer = 20
  6.     Dim NewWidth, NewHeight, DesignCmbWidth As Integer
  7.     Dim _TBKeyWordIndex As Integer
  8.     Dim _IsShowColumnHeader As Boolean = True
  9.     Dim _IsShowRowHeader As Boolean = True
  10.     Dim _CmbBoxDorpDown As Boolean = False
  11.     ''' 
  12.     ''' 设置CmbBox中的List的宽度。
  13.     ''' 
  14.     ''' 
  15.     ''' 
  16.     ''' 
  17.     Public Property LvWidth() As Integer
  18.         Get
  19.             Return Me.Lv.Width
  20.         End Get
  21.         Set(ByVal Value As Integer)
  22.             Me.Lv.Width = Value
  23.         End Set
  24.     End Property
  25.     ''' 
  26.     ''' 设置CmbBox中的List的高度。
  27.     ''' 
  28.     ''' 
  29.     ''' 
  30.     ''' 
  31.     Public Property LvHeight() As Integer
  32.         Get
  33.             Return Me.Lv.Height
  34.         End Get
  35.         Set(ByVal Value As Integer)
  36.             Me.Lv.Height = Value
  37.             NewHeight = CtrlHeight + Value
  38.         End Set
  39.     End Property
  40.     ''' 
  41.     ''' 是否显示列标题。
  42.     ''' 
  43.     ''' 
  44.     ''' 
  45.     ''' 
  46.     Public Property IsShowColumnHeader() As Boolean
  47.         Get
  48.             Return _IsShowColumnHeader
  49.         End Get
  50.         Set(ByVal Value As Boolean)
  51.             _IsShowColumnHeader = Value
  52.         End Set
  53.     End Property
  54.     ''' 
  55.     ''' 是否显示行标题。
  56.     ''' 
  57.     ''' 
  58.     ''' 
  59.     ''' 
  60.     Public Property IsShowRowHeader() As Boolean
  61.         Get
  62.             Return _IsShowRowHeader
  63.         End Get
  64.         Set(ByVal Value As Boolean)
  65.             _IsShowRowHeader = Value
  66.         End Set
  67.     End Property
  68.     ''' 
  69.     ''' 获取或设置CmbBoxListView中的当前文本(重写基类Text)。
  70.     ''' 
  71.     ''' 
  72.     ''' 
  73.     ''' 
  74.     Public Overrides Property Text() As String
  75.         Get
  76.             Return (Me.CmbBox.Text)
  77.         End Get
  78.         Set(ByVal Value As String)
  79.             Me.CmbBox.Text = Value
  80.         End Set
  81.     End Property
  82.     Public ReadOnly Property SelectedIndex() As Integer
  83.         Get
  84.             Return Lv.SelectedIndices.Item(0)
  85.         End Get
  86.     End Property
  87.     Private Sub CmbBoxListView_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
  88.         Me.Lv.Location = New Point(Me.CmbBox.Location.X, Me.CmbBox.Location.Y + Me.CmbBox.Height)
  89.         Lv.GridLines = True
  90.         Lv.FullRowSelect = True
  91.         Lv.View = View.Details
  92.         Lv.Scrollable = True
  93.         Lv.MultiSelect = False
  94.         Me.Lv.Clear()
  95.         NewHeight = CtrlHeight + Me.Lv.Height
  96.     End Sub
  97.     Private Sub CmbBoxListView_SizeChanged(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.SizeChanged
  98.         If Me.Width < 40 Then
  99.             Me.Width = 40
  100.         End If
  101.         If _CmbBoxDorpDown = False Then
  102.             Me.Height = CtrlHeight
  103.             DesignCmbWidth = Me.Width
  104.             Me.CmbBox.Width = DesignCmbWidth
  105.         End If
  106.     End Sub
  107.     Private Sub CmbBoxListView_LostFocus(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.LostFocus
  108.         Me.HidenLV()
  109.     End Sub
  110.     Private Sub CmbBox_DropDown(ByVal sender As ObjectByVal e As System.EventArgs) Handles CmbBox.DropDown
  111.         Me.Lv.Visible = Not Me.Lv.Visible
  112.         If Me.Lv.Visible = True Then
  113.             _CmbBoxDorpDown = True
  114.             If Me.CmbBox.Width > Me.Lv.Width Then
  115.                 Me.Lv.Width = Me.CmbBox.Width
  116.             End If
  117.             NewWidth = IIf(Me.Lv.Width > Me.CmbBox.Width, Me.Lv.Width, Me.CmbBox.Width)
  118.             Me.Width = NewWidth
  119.             Me.Height = NewHeight
  120.             Me.BringToFront()
  121.             Me.Lv.Select()
  122.         Else
  123.             _CmbBoxDorpDown = False
  124.             Me.Width = DesignCmbWidth
  125.             Me.Height = CtrlHeight
  126.         End If
  127.     End Sub
  128.     Private Sub Lv_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles Lv.Click
  129.         Me.CmbBox.Text = Me.Lv.SelectedItems(0).SubItems(_TBKeyWordIndex + 1).Text
  130.         RaiseEvent SelectTextChanged(Me, e)
  131.         Me.HidenLV()
  132.     End Sub
  133.     Private Sub Lv_LostFocus(ByVal sender As ObjectByVal e As System.EventArgs) Handles Lv.LostFocus
  134.         Me.HidenLV()
  135.     End Sub
  136.     ''' 
  137.     ''' 将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定绑定的字段的名称。
  138.     ''' 
  139.     ''' 绑定的数据表
  140.     ''' 指定绑定的字段的名称。
  141.     ''' 
  142.     Public Sub BindDataTB(ByVal DataTB As DataTable, ByVal TBKeyWordName As String)
  143.         AddColumnsHeader(DataTB)
  144.         FindKeyWordPosition(DataTB, TBKeyWordName)
  145.         FillDataTB2Lv(DataTB)
  146.     End Sub
  147.     ''' 
  148.     ''' 将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定绑定的字段的位置。
  149.     ''' 
  150.     ''' 绑定的数据表
  151.     ''' 指定绑定的字段名的位置。
  152.     ''' 
  153.     Public Sub BindDataTB(ByVal DataTB As DataTable, ByVal TBKeyWordPosition As Integer)
  154.         AddColumnsHeader(DataTB)
  155.         _TBKeyWordIndex = TBKeyWordPosition - 1
  156.         FillDataTB2Lv(DataTB)
  157.     End Sub
  158.     ''' 
  159.     ''' 将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定新的列表标题和绑定的标题的名称。
  160.     ''' 
  161.     ''' 绑定的数据表
  162.     ''' 新的列表标题,用 , 或 ; 分隔开的字符串。
  163.     ''' 指定绑定的标题的名称。
  164.     ''' 
  165.     Public Sub BindDataTB(ByVal DataTB As DataTable, ByVal NewColumnsNameStr As StringByVal KeyWordName As String)
  166.         AddColumnsHeader(NewColumnsNameStr)
  167.         FindKeyWordPosition(NewColumnsNameStr, KeyWordName)
  168.         FillDataTB2Lv(DataTB)
  169.     End Sub
  170.     ''' 
  171.     '''  将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定新的列表标题和绑定的标题的位置。
  172.     ''' 
  173.     ''' 绑定的数据表
  174.     ''' 新的列表标题,用 , 或 ; 分隔开的字符串。
  175.     ''' 指定绑定的标题的位置。
  176.     ''' 
  177.     Public Sub BindDataTB(ByVal DataTB As DataTable, ByVal NewColumnsNameStr As StringByVal KeyWordPosition As Integer)
  178.         AddColumnsHeader(NewColumnsNameStr)
  179.         _TBKeyWordIndex = KeyWordPosition - 1
  180.         FillDataTB2Lv(DataTB)
  181.     End Sub
  182.     Private Sub FillDataTB2Lv(ByVal _DataTB As DataTable)
  183.         Dim i, j As Integer
  184.         If _DataTB.Rows.Count > 0 Then
  185.             Lv.Items.Clear()
  186.             For i = 0 To _DataTB.Rows.Count - 1
  187.                 Dim li As New ListViewItem
  188.                 li.SubItems.Clear()
  189.                 li.Text = i
  190.                 For j = 0 To _DataTB.Columns.Count - 1
  191.                     li.SubItems.Add(_DataTB.Rows(i)(j).ToString)
  192.                 Next
  193.                 Lv.Items.Add(li)
  194.             Next
  195.         End If
  196.         UpdateLvColRowSetting()
  197.     End Sub
  198.     Private Sub AddColumnsHeader(ByVal _DataTB As DataTable)
  199.         Dim i As Integer
  200.         If _DataTB.Rows.Count > 0 Then
  201.             Lv.Columns.Clear()
  202.             Lv.Columns.Add("序")
  203.             Lv.Columns(0).Width = 30
  204.             For i = 0 To _DataTB.Columns.Count - 1
  205.                 Lv.Columns.Add(_DataTB.Columns(i).Caption)
  206.             Next
  207.         End If
  208.     End Sub
  209.     Private Sub AddColumnsHeader(ByVal ColumnsNameStr As String)
  210.         Dim i As Integer
  211.         If ColumnsNameStr > "" Then
  212.             Dim CName() As String
  213.             Lv.Columns.Clear()
  214.             Lv.Columns.Add("序")
  215.             Lv.Columns(0).Width = 30
  216.             If ColumnsNameStr.Contains(","Then
  217.                 CName = Split(ColumnsNameStr, ",")
  218.                 For i = 0 To UBound(CName)
  219.                     Lv.Columns.Add(CName(i))
  220.                 Next
  221.             End If
  222.             If ColumnsNameStr.Contains(";"Then
  223.                 CName = Split(ColumnsNameStr, ";")
  224.                 For i = 0 To UBound(CName)
  225.                     Lv.Columns.Add(CName(i))
  226.                 Next
  227.             End If
  228.         End If
  229.     End Sub
  230.     Private Sub FindKeyWordPosition(ByVal _DataTB As DataTable, ByVal KeyWord As String)
  231.         Dim i As Integer
  232.         Dim TitleStr As ArrayList
  233.         If _DataTB.Rows.Count > 0 Then
  234.             TitleStr = New ArrayList
  235.             For i = 0 To _DataTB.Columns.Count - 1
  236.                 TitleStr.Add(_DataTB.Columns(i).Caption)
  237.             Next
  238.             _TBKeyWordIndex = TitleStr.IndexOf(KeyWord)
  239.             TitleStr = Nothing
  240.         End If
  241.     End Sub
  242.     Private Sub FindKeyWordPosition(ByVal NewColumnsNameStr As StringByVal KeyWord As String)
  243.         Dim i As Integer
  244.         Dim TitleStr As ArrayList
  245.         If NewColumnsNameStr > "" Then
  246.             Dim CName() As String
  247.             TitleStr = New ArrayList
  248.             If NewColumnsNameStr.Contains(","Then
  249.                 CName = Split(NewColumnsNameStr, ",")
  250.                 For i = 0 To UBound(CName)
  251.                     TitleStr.Add(CName(i))
  252.                 Next
  253.                 _TBKeyWordIndex = TitleStr.IndexOf(KeyWord)
  254.             End If
  255.             If NewColumnsNameStr.Contains(";"Then
  256.                 CName = Split(NewColumnsNameStr, ",")
  257.                 For i = 0 To UBound(CName)
  258.                     TitleStr.Add(CName(i))
  259.                 Next
  260.                 _TBKeyWordIndex = TitleStr.IndexOf(KeyWord)
  261.             End If
  262.             TitleStr = Nothing
  263.         End If
  264.     End Sub
  265.     Private Sub UpdateLvColRowSetting()
  266.         If IsShowColumnHeader Then
  267.             Lv.HeaderStyle = ColumnHeaderStyle.Nonclickable
  268.         Else
  269.             Lv.HeaderStyle = ColumnHeaderStyle.None
  270.         End If
  271.         If Lv.Columns.Count > 0 Then
  272.             For i As Integer = 0 To (Lv.Columns.Count - 1)
  273.                 Lv.Columns(i).AutoResize(ColumnHeaderAutoResizeStyle.HeaderSize)
  274.             Next
  275.         End If
  276.         If IsShowRowHeader Then
  277.             If Lv.Columns.Count > 0 Then Lv.Columns(0).Width = 30
  278.         Else
  279.             If Lv.Columns.Count > 0 Then Lv.Columns(0).Width = 0
  280.         End If
  281.     End Sub
  282.     Private Sub HidenLV()
  283.         Me.Lv.Visible = False
  284.         Me.Width = DesignCmbWidth
  285.         Me.Height = CtrlHeight
  286.     End Sub
  287. End Class

你可能感兴趣的:(2.VB.Net)