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

来源:互联网 发布:网络建设规范 编辑:程序博客网 时间:2024/04/30 09:24

最近在用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

 

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

 

绑定效果:

 

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

  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.     ''' <summary>
  12.     ''' 设置CmbBox中的List的宽度。
  13.     ''' </summary>
  14.     ''' <value></value>
  15.     ''' <returns></returns>
  16.     ''' <remarks></remarks>
  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.     ''' <summary>
  26.     ''' 设置CmbBox中的List的高度。
  27.     ''' </summary>
  28.     ''' <value></value>
  29.     ''' <returns></returns>
  30.     ''' <remarks></remarks>
  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.     ''' <summary>
  41.     ''' 是否显示列标题。
  42.     ''' </summary>
  43.     ''' <value></value>
  44.     ''' <returns></returns>
  45.     ''' <remarks></remarks>
  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.     ''' <summary>
  55.     ''' 是否显示行标题。
  56.     ''' </summary>
  57.     ''' <value></value>
  58.     ''' <returns></returns>
  59.     ''' <remarks></remarks>
  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.     ''' <summary>
  69.     ''' 获取或设置CmbBoxListView中的当前文本(重写基类Text)。
  70.     ''' </summary>
  71.     ''' <value></value>
  72.     ''' <returns></returns>
  73.     ''' <remarks></remarks>
  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.     ''' <summary>
  137.     ''' 将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定绑定的字段的名称。
  138.     ''' </summary>
  139.     ''' <param name="DataTB">绑定的数据表</param>
  140.     ''' <param name="TBKeyWordName">指定绑定的字段的名称。</param>
  141.     ''' <remarks></remarks>
  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.     ''' <summary>
  148.     ''' 将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定绑定的字段的位置。
  149.     ''' </summary>
  150.     ''' <param name="DataTB">绑定的数据表</param>
  151.     ''' <param name="TBKeyWordPosition">指定绑定的字段名的位置。</param>
  152.     ''' <remarks></remarks>
  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.     ''' <summary>
  159.     ''' 将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定新的列表标题和绑定的标题的名称。
  160.     ''' </summary>
  161.     ''' <param name="DataTB">绑定的数据表</param>
  162.     ''' <param name="NewColumnsNameStr">新的列表标题,用 , 或 ; 分隔开的字符串。</param>
  163.     ''' <param name="KeyWordName">指定绑定的标题的名称。</param>
  164.     ''' <remarks></remarks>
  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.     ''' <summary>
  171.     '''  将DataTable的数据绑定到ListView中,作为CmbBox的List数据。并指定新的列表标题和绑定的标题的位置。
  172.     ''' </summary>
  173.     ''' <param name="DataTB">绑定的数据表</param>
  174.     ''' <param name="NewColumnsNameStr">新的列表标题,用 , 或 ; 分隔开的字符串。</param>
  175.     ''' <param name="KeyWordPosition">指定绑定的标题的位置。</param>
  176.     ''' <remarks></remarks>
  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
原创粉丝点击