1. 程式人生 > >MFC中的ComboBox的使用

MFC中的ComboBox的使用

MFC ComboBox

一、入門篇

ComboBox (組合框)控制元件很簡單,可以節省空間。從使用者角度來看,這個控制元件是由一個文字輸入控制元件和一個下拉選單組成的。使用者可以從一個預先定義的列表裡選擇一個選項,同時也可以直接在文字框裡面輸入文字。下面的例子簡要說明如何利用 MFC CComboBox Class來操作字串列表。

1、定義控制元件對應變數

假定已經建立了一個Dialog,並且從控制元件工具箱將 Combo Box 控制元件拖放到上面。開啟 Class Wizard,新增控制元件對應變數,如:CComboBoxm_cbExamble;

在後面的程式碼中會不斷使用這個變數。

2、向控制元件新增 Items

1) 在Combo Box控制元件屬性的Data標籤裡面新增,一行表示Combo Box下拉列表中的一行。換行用ctrl+回車。

2) 利用函式 AddString() 向 Combo Box 控制元件新增 Items,如:

m_cbExample.AddString(“StringData1”);

m_cbExample.AddString(“StringData2”);

m_cbExample.AddString(“StringData3”);

3) 也可以呼叫函式 InsertString() 將 Item 插入指定位置 nIndex,如:

m_cbExample.InsertString( nIndex, “StringData” );

3、從控制元件得到選定的Item

假設在控制元件列表中已經選定某項,現在要得到被選定項的內容,首先要得到該項的位置,然後得到對應位置的內容。這裡會用到兩個函式,如:

int nIndex = m_cbExample.GetCurSel();

CString strCBText;

m_cbExample.GetLBText( nIndex, strCBText);

這樣,得到的內容就儲存在 strCBText 中。

若要選取當前內容,可呼叫函式GetWindowText(strCBText)

4、在控制元件中查詢給定Item

這種操作一般用於在程式中動態修改控制元件中該項的值,可以用函式FindStringExact() 精確匹配,如:

int nIndex = m_cbExample.FindStringExact( nStartAfter, “value to befound”);

nStartAfter指明從哪一行開始查詢。如果查詢成功,返回的是該項的位置;否則,返回CB_ERR。

也可以選中包含指定字串的項,如:

int nIndex = m_cbExample.SelectString( nStartAfter, “value to beselected”);

5、刪除控制元件中的Item

該操作可以利用函式DeleteString(),需要指定被刪除項的位置,如:

m_cbExample.DeleteString(nIndex);

也可以使用函式ResetContent(),清除目前的所有項,如:

m_cbExample.ResetContent();

6、顯示控制元件中的某項

int nIndex = m_cbExample.GetCurSel(); //當前選中的項

m_cbExample.SetCurSel(nIndex); //設定第nIndex項為顯示的內容

7、得到或設定輸入框中被選中的字元位置

DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar);

BOOL LimitText( int nMaxChars ); 設定輸入框中可輸入的最大字元數。

8、列表框常用訊息對映巨集

       ON_CBN_DBLCLK 滑鼠雙擊

ON_CBN_DROPDOWN 列表框被彈出

ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生

ON_CBN_SELCHANGE 列表框中選擇的行發生改變

ON_CBN_EDITUPDATE 輸入框中內容被更新

補充:

一、如何新增/刪除Combo Box內容

1,在ComboBox控制元件屬性的Data標籤裡面新增,一行表示ComboBox下拉列表中的一行。換行用ctrl+回車。

2,在程式初始化時動態新增

如: //控制元件內容初始化

CString strTemp;

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除現有所有內容

for(int i=1;i<=100;i++)

{

  strTemp.Format("%d",i);

  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);

}

3,下拉的時候新增

如: CString strTemp;

intiCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount();//取得目前已經有的行數

if(iCount<1)//防止重複多次新增

{

  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();

   for(inti=1;i<=100;i++)

   {

   strTemp.Format("%d",i);

   ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);

   }

}

4,刪除

DeleteString( UINT nIndex )//刪除指定行,

5,插入

InsertString( int nIndex,LPCTSTR lpszItem )//將行插入到指定位置

6,查詢

FindString( int nStartAfter,LPCTSTR lpszItem )//可以在當前所有行中查詢指定的字元傳的位置,nStartAfter指明從那一行開始進行查詢。

int SelectString( intnStartAfter, LPCTSTR lpszItem )//可以選中包含指定字串的行

二、如何控制Combo Box的下拉長度

1,首先要知道兩點:一、那就是在設計介面裡,點選一下Combo Box的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

2,二、屬性裡有個 No integral height 鉤選項,表示最大長度為設計長度,如果實際內容比設計長度多,就出現滾動條,少就以實際長度顯示。

三、選擇其中的某行

1,選中:

intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel();//當前選中的行。

2,設定

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n)//設定第n行內容為顯示的內容。

四、取得Combo Box框內容

1取當前內容

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);

2取其他行內容

((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);

四、獲得焦點

通常要判斷控制元件是否獲得了焦點,可以用GetFocus()函式

例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點是否在編輯框IDC_EDIT_VALUE2內。

但是combobox 的焦點不同,因為它是由edit和listbox兩部分組成的

所以獲得焦點要用GetParent():if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))

控制Combo Box的下拉長度

1,首先要知道兩點:一、那就是在設計介面裡,點選一下Combo Box的下拉箭頭,此時出現的調整框就是Combo Box的下拉調整框。

二、屬性裡有個 No integral height 鉤選項,表示最大長度為設計長度,如果實際內容比設計長度多,就出現滾動條,少就以實際長度顯示。

VC++Combo Box/Combo Box Ex控制元件

  組合視窗是由一個輸入框和一個列表框組成。建立一個組合視窗可以使用成員函式:

BOOLCListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd*pParentWnd, UINT nID = 0xffff );

其中dwStyle將指明該視窗的風格,除了子視窗常用的風格WS_CHILD,WS_VISIBLE外,你可以針對列表控制元件指明專門的風格。

CBS_DROPDOWN下拉式組合框

CBS_DROPDOWNLIST下拉式組合框,但是輸入框內不能進行輸入

CBS_SIMPLE輸入框和列表框同時被顯示

LBS_SORT所有的行按照字母順序進行排序

由於組合框內包含了列表框,所以列表框的功能都能夠使用,如可以利用:

intAddString( LPCTSTR lpszItem )新增行,

intDeleteString( UINT nIndex )刪除指定行,

intInsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。

voidResetContent( )可以刪除列表框中所有行。

通過呼叫int GetCount( )得到當前列表框中行的數量。

如果需要得到/設定當前被選中的行的位置,可以呼叫int GetCurSel( )/intSetCurSel(int iIndex)。通過呼叫int GetLBText( intnIndex, LPTSTR lpszText )得到列表框內指定行的字串。

此外通過呼叫int FindString( intnStartAfter, LPCTSTR lpszItem )可以在當前所有行中查詢指定的字元傳的位置,nStartAfter指明從那一行開始進行查詢。

intSelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包含指定字串的行。

此外輸入框的功能都能夠使用,如可以利用:

DWORDGetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar )得到或設定輸入框中被選中的字元位置。

BOOLLimitText( int nMaxChars )設定輸入框中可輸入的最大字元數。

輸入框的剪貼簿功能Copy,Clear,Cut,Paste動可以使用。

最後介紹一下列表框幾種常用的訊息對映巨集:

ON_CBN_DBLCLK滑鼠雙擊

ON_CBN_DROPDOWN列表框被彈出

ON_CBN_KILLFOCUS/ ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生

ON_CBN_SELCHANGE列表框中選擇的行發生改變

ON_CBN_EDITUPDATE輸入框中內容被更新

使用以上幾種訊息對映的方法為定義原型如:afx_msg voidmemberFxn( );的函式,並且定義形式如ON_Notification( id,memberFxn )的訊息對映。如果在對話方塊中使用組合框,Class Wizard會自動列出相關的訊息,並能自動產生訊息對映程式碼。

在MFC 4.2中對組合框進行了增強,你可以在組合框中使用ImageList,有一個新的類CComboBoxEx(由CComboBox派生)來實現這一功能。在CComboBoxEx類中添加了一些新的成員函式來實現新的功能:首先你需要呼叫CImageList*SetImageList( CImageList* pImageList );來設定ImageList,然後呼叫

intInsertItem( const COMBOBOXEXITEM* pCBItem );來新增行,其中COMBOBOXEXITEM定義如下:

typedefstruct { UINT mask; int iItem; LPTSTR pszText; int cchTextMax; int iImage; intiSelectedImage; int iOverlay;       int iIndent; LPARAMlParam;} COMBOBOXEXITEM, *PCOMBOBOXEXITEM;

你需要設定mask=CBEIF_IMAGE CBEIF_TEXT,並設定iItem為插入位置,設定pszText為顯示字串,設定iImage為顯示的圖示索引。下面的程式碼演示瞭如何進行插入:

/*m_cbeWnd為已經建立的CComboBox物件

m_list為CImageList物件IDB_IMG 為16*(16*4)的點陣圖,每個圖片為16*16共4個圖示*/

m_list.Create(IDB_IMG,16,4,RGB(0,0,0));

m_cbeWnd.SetImageList(&m_list);

COMBOBOXEXITEMinsItem;insItem.mask=CBEIF_IMAGE CBEIF_TEXT;insItem.iItem=0;insItem.iImage=0;insItem.pszText="Line1";m_cbeWnd.InsertItem(&insItem);insItem.iItem=1;insItem.iImage=1;insItem.pszText="Line2";m_cbeWnd.InsertItem(&insItem);

通過呼叫int DeleteItem( intiIndex );來刪除行,並指明行的位置。

通過呼叫BOOL GetItem( COMBOBOXEXITEM*pCBItem )/BOOL SetItem( const COMBOBOXEXITEM* pCBItem );來得到/設定行資料。

二、提高篇(控制元件應用方案)

1.功能

組合框(ComboBox)是文字框(TextBox)和列表框(ListBox)的組合。使用者可以從文字框中輸入文字,也可以從列表框中選取列表項。

2.屬性

ComboBox控制元件的常用屬性如表1所示。

表1                   ComboBox控制元件的常用屬性

編號

屬性

說明

1

IntegralHeight

返回或設定一個值,指示控制元件是否顯示部分專案。執行時是隻讀的

2

List

返回或設定控制元件列表部分的專案

3

ListCount

返回控制元件的列表部分專案的個數

4

ListIndex

返回或設定控制元件中當前選擇專案的索引,在設計時不可用

5

Locked

返回或設定一個值,以指定控制元件是否可被編輯

6

Sorted

返回一個值,指定控制元件的元素是否自動按字母表順序排序

7

Style

返回或設定一個值,該值用來指示控制元件的顯示型別和行為

8

TabIndex

返回或設定父窗體中大部分物件的〈Tab〉鍵次序

9

Text

ComboBox控制元件(Style屬性設定為0(下拉組合框)或為1(簡單組合框))返回或設定編輯域中的文字

下面對比較重要的屬性進行詳細介紹。

(1)List屬性

返回或設定控制元件列表部分的專案。

語法:

object.List(index) [= string]

object:物件表示式。

index:列表中具體某一專案的號碼。

string:字串表示式,指定列表中的專案。

示例:

下例演示的是,當程式執行時,當單擊ComboBox控制元件列表中物件後,在標籤控制元件中將顯示所選擇的物件名稱,如圖1所示。

圖1  List屬性演示示例

程式程式碼如下:

'單擊ComboBox控制元件列表中物件後,在標籤控制元件中將顯示所選擇的物件名稱

Private Sub Combo1_Click()

   Label1.Caption = "選取的專案為:" & Combo1.List(Combo1.ListIndex)

End Sub

'窗體啟動時組合框1中自動加十一個從Combo1(0)到Combo1(10)的專案

Private Sub Form_Load()

    For i =0 To 10

       Combo1.AddItem "Combo1(" & i & ")"

    Next

End Sub

(2)ListCount屬性

返回控制元件列表中部分專案的個數。

語法:

object.ListCount

object:物件表示式。

示例:

下例演示的是如何向ComboBox控制元件中載入專案。程式執行後單擊窗體,在標籤控制元件中將顯示ComboBox控制元件中所載入專案的個數,如圖2所示。

圖2  ListCount屬性的應用示例

程式完整程式碼如下:

'單擊窗體時在標籤控制元件中將顯示ComboBox控制元件中所載入專案的個數

Private Sub Form_Click()

   Label1.Caption = "列表中的專案為:" & Combo1.ListCount & "個"

End Sub

'向ComboBox控制元件中加入121個專案

Private Sub Form_Load()

    For i =0 To 120

       Combo1.AddItem "Combo1(" & i & ")"

    Next

End Sub

(3)ListIndex屬性

返回或設定控制元件中當前選擇專案的索引。

語法:

object.ListIndex [= index]

object:物件表示式。

index:數值表示式,指定當前專案的索引。

示例:

下面的例子演示的是ComboBox控制元件的ListIndex屬性,用於顯示每個季節的銷售額。程式執行時,在ComboBox控制元件中選擇季節名稱,在標籤中就會顯示出該季節的銷售資訊,如圖3所示。

圖3  ListIndex屬性的應用示例

程式完整程式碼如下:

Dim Season(0 To 3)       '宣告兩個陣列的大小

Dim Sale(0 To 3)

'在ComboBox控制元件中選擇季節名稱,在標籤中就會顯示出該季節的銷售資訊

Private SubCombo1_Click()

    Label1.Caption = Combo1.Text &"  " & Sale(Combo1.ListIndex)

End Sub

'窗體載入時設定ComboBox控制元件的專案名稱和專案索引

Private Sub Form_Load()

    Dim i  '宣告變數

    AutoSize = True

    Season(0) = "春季"

    Season(1) = "夏季"

    Season(2) = "秋季"

    Season(3) = "冬季"

    Sale(0)= "$1300,500"

    Sale(1)= "$208,900"

    Sale(2)= "$1,412,500"

    Sale(3)= "$1,220,500"

    For i = 0 To 3         '在列表中新增名字

        Combo1.AddItem Season(i)

    Next i

    Combo1.ListIndex = 0         '顯示列表中的第一項

End Sub

(4)Style屬性

返回或設定一個值,該值用來指示控制元件的顯示型別和行為。該屬性在執行時為只讀。

語法:

object.Style

object:物件表示式。其設定值如表2所示。

表2                   object的設定值

常數

說明

VbComboDropDown

0

下拉式組合框。包括一個下拉式列表和一個文字框。可以從列表選擇或在文字框中輸入

VbComboSimple

1

簡單組合框。包括一個文字框和一個不能下拉的列表。可以從列表中選擇或在文字框中輸入內容

VbComboDrop-DownList

2

下拉式列表。這種樣式僅允許從下拉式列表中選擇

下面的例子演示的是ComboBox控制元件的Style屬性。設定3個不同的屬性值後的效果如圖4和圖5所示。

圖4  未新增時的效果

圖5  新增後的效果

3.方法

下面介紹ComboBox控制元件比較重要的方法。

(1)AddItem方法

用於將專案新增到ComboBox控制元件中。不支援命名引數。

語法:

object.AddItem item, index

object:必需的。物件表示式。

item:必需的。字串表示式,用來指定新增到物件的專案。

index:可選的整數值,用來指定新專案或行在該物件中的位置。

示例:

下面的例子演示的是ComboBox控制元件的AddItem方法。利用AddItem方法將月份資訊新增到ComboBox控制元件的列表當中,如圖6所示。

圖6  AddItem方法的應用示例

程式完整程式碼如下:

'將專案1月到12月新增到ComboBox控制元件中

Private Sub Form_Load()

    For i = 0 To 11

        Combo1.AddItem i + 1 & " 月"

    Next

End Sub

(2)Clear方法

用於清除ComboBox控制元件中的內容。

語法:

object.Clear

object:物件表示式。

示例:

下例演示的是,當程式執行的時候,單擊窗體上的“清除”按鈕將清除ComboBox控制元件中的內容,如圖7所示。

圖7  Clear方法的應用

程式相關程式碼如下:

'點選清除按鈕時清除ComboBox控制元件中的內容

Private SubCommand1_Click()

    Combo1.Clear

End Sub

程式完整程式碼:

'點選清除按鈕時清除ComboBox控制元件中的內容

Private Sub Command1_Click()

   Combo1.Clear

End Sub

'窗體啟動時將專案1月到12月新增到ComboBox控制元件中

Private Sub Form_Load()

    For i =0 To 11

       Combo1.AddItem i + 1 & " 月"

    Next

End Sub

4.事件

ComboBox控制元件的常用事件如表3所示。

表3                   ComboBox控制元件的常用事件

編號

事件

說明

1

Change

當控制元件的內容發生改變時發生。該事件僅在Style屬性設定為0(下拉Combo)或1(簡單Combo)和正文被改變或者通過程式碼改變了Text屬性的設定時才會發生

2

DblClick

當在一個物件上按下和釋放滑鼠按鍵並再次按下和釋放滑鼠按鍵時,該事件發生

3

DropDown

該事件是當ComboBox控制元件的列表部分正要展開時發生

4

Scroll

當Combo Box控制元件的滾動條被重新定位時,此事件發生

下面對比較重要的事件進行詳細介紹。

(1)Change事件

改變控制元件文字框部分的正文。該事件僅在Style屬性設定為0或1和正文被改變或者通過程式碼改變了Text屬性的設定時才會發生。

語法:

Private Sub object_Change([index As Integer])

object:物件表示式。

index:一個整數,用來惟一地標識一個在控制元件陣列中的控制元件。

(2)Click事件

此事件在ComboBox控制元件上按下然後釋放一個滑鼠按鍵時發生,也會在一個控制元件的值改變時發生。

語法:

Private Sub object_Click([index As Integer])

object:物件表示式。

index:一個整數,用來惟一地標識一個在控制元件陣列中的控制元件。

應用一:帶查詢功能的ComboBox控制元件

例項說明

如果在下拉列表中的專案過多,想在其中選擇需要的專案是很困難的。如果ComboBox控制元件具有查詢功能就會很方便。下面將介紹帶有查詢功能ComboBox控制元件的例項。執行程式。在ComboBox控制元件中輸入資訊,如果在ComboBox列表框中有與之相匹配的資訊,即可將全部資訊顯示在文字框中。如本例項中,在文字框中輸入“麻”,由於在下面的列表中有與之相匹配的“麻辣火鍋”,則在文字框中可直接顯示“麻辣火鍋”。實現效果如圖8所示。

圖8  帶查詢功能的ComboBox控制元件

思路與技術

在實現帶查詢功能的ComboBox控制元件時,主要應用了API函式中的SendMessage函式。本例項中利用SendMessage函式將引數傳遞給ComboBox控制元件,以實現查詢的功能。SendMessage函式用於呼叫一個視窗的視窗函式,將一條訊息發給那個視窗。直到訊息被處理完畢,該函式才會返回。

其函式宣告如下:

Private Declare Function SendMessage Lib"user32" Alias "SendMessageA" (ByVal hWnd As Long, ByValwMsg As Long, ByVal wParam As Long, lParam As Any) As Long

引數說明:

l  l          hWnd    Long型,要接受訊息的那個視窗的控制代碼。

l  l          wMsg    Long型,訊息的識別符號。

l  l         wParam    Long型,具體取決於訊息。

l  l          IParam    Any型,具體取決於訊息。

開發步驟

(1)新建一個標準工程,建立一個新窗體,預設名為Form1。

(2)在窗體上新增一個Frame控制元件。

(3)在Frame1上新增一個Label控制元件,用於顯示提示資訊;一個ComboBox控制元件,用於查詢資訊;一個Image控制元件,用於顯示圖片,並設定其Picture屬性。

在窗體中控制元件說明如表4所示。

表4           Form1窗體中控制元件部分屬性設定

控制元件名

屬性

ComboBox

Name

Combo1

Frame

Name

Frame1

Image

Name

Image1

ListBox

Name

Caption

List1

在組合框中輸入資訊,如果列表中含有與之相匹配的資訊,即可顯示在文字框中。

(4)為Form1窗體新增如下程式碼。

Private Declare Function SendMessage Lib"user32" Alias "SendMessageA" (ByVal hwnd As Long, ByValwMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Const CB_FINDSTRING = &H14C

Const CB_ERR = (-1)

'帶查詢功能的ComboBox控制元件

Private Sub Combo1_KeyPress(KeyAscii As Integer)

    Dim TempAs Long

    DimMyStr As String

    IfCombo1.SelLength = 0 Then

        '如果選擇的字元為零,將列標框中的文字與鍵入的字元相組合

       MyStr = Combo1.Text & Chr(KeyAscii)

   Else  '如果選擇的字元數不為零

       MyStr = Left(Combo1.Text, Combo1.SelStart) & Chr(KeyAscii)

    End If

    '在列表框控制元件中查詢與變數MyStr相匹配的字串。

    '如果找到,則返回值為第一個匹配的字串的索引值。如果未找到,則返回值為-1

    Temp =SendMessage(Combo1.hwnd, CB_FINDSTRING, True, ByVal MyStr)

    If Temp<> CB_ERR Then  '如果找到

       Combo1.ListIndex = Temp  '將找到的專案新增到編輯部分

       Combo1.SelStart = Len(Combo1.Text) '將游標設定在文字尾部

    End If

    KeyAscii= 0

End Sub

'窗體啟動時將專案新增到ComboBox控制元件中

Private Sub Form_Load()

    '向類標框中新增專案

   Combo1.AddItem "美式炸雞": Combo1.AddItem "中國餃子": Combo1.AddItem "冰淇淋"

    Combo1.AddItem"春捲":Combo1.AddItem "陝西涼皮": Combo1.AddItem "麻辣火鍋"

   Combo1.AddItem "四川麻辣燙": Combo1.AddItem "東北餃子王": Combo1.AddItem "香格里拉"

   Combo1.AddItem "K F C": Combo1.Text = ""

End Sub

應用二:將資料表中的欄位新增到ComboBox控制元件

例項說明

本例項實現的是將資料表中的欄位名新增到ComboBox控制元件中。執行程式,單擊“新增”按鈕,即可將本例項資料夾下的資料庫(db_medicine. mdb)中的資料表(tb_xsd)中的欄位新增到ComboBox控制元件中,實現效果如圖9所示。

圖9  將資料表中的欄位新增到ComboBox控制元件

思路與技術

要將資料表中的欄位新增到ComboBox控制元件,需通過資料集物件提取相應表中的欄位的名稱並將其儲存到ComboBox控制元件中。下面介紹一下ComboBox控制元件的AddItem方法。

AddItem方法用於將專案新增到ComboBox控制元件中。

語法形式如下:

object.AddItem item, index

引數說明:

l  l          object    必需的。一個物件表示式。

l  l          Item    必需的。字串表示式,用來指定新增到該物件中的專案。

l  l          Index    可選的。是整數,用來指定新專案或行在該物件中的位置。

開發步驟

(1)新建一個標準工程,建立一個新窗體,將其命名為main_cxtj_sellfind。

(2)在窗體上新增一個Frame控制元件。

(3)在Frame1上新增一個Label控制元件和一個PictureBox控制元件,並設定PictureBox控制元件的Picture屬性。

(4)在Frame1上新增一個ComboBox控制元件,將其命名為Cbx_Fields,主要用於儲存資料表中的欄位資訊。再新增一個CommandButton控制元件,將其命名為Cmd_Add,主要用於執行新增操作。

在main_cxtj_sellfind窗體中控制元件部分屬性設定如表5所示。

表5           main_cxtj_sellfind窗體中控制元件部分屬性設定

控制元件名

屬性

ComboBox

Name

Cbx_Fields

CommandButton

Name

Caption

Cmd_Add

新增

Frame

Name

Frame1

Label

Name

Caption

Label1

欄位名稱

PictureBox

Name

Picture1

(5)為main_cxtj_sellfind窗體新增如下程式碼。

Dim fld

Dim rs As New ADODB.Recordset      '定義資料集物件

'建立資料庫連線

Function cnn() As ADODB.Connection              '定義連線函式

    '建立連線

    Set cnn= New ADODB.Connection

    cnn.Open"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path &"\db_medicine.mdb;Persist Security Info=False"

End Function

'單擊新增按鈕將資料表中的欄位名新增到ComboBox控制元件中

Private Sub Cmd_Add_Click()          '新增按鈕

    rs.Open"select * from tb_xsd", cnn, adOpenKeyset, adLockOptimistic

    Set fld= rs.Fields

    For Eachfld In rs.Fields

        '向ComboBox控制元件中新增欄位

       Cbx_Fields.AddItem fld.Name

    Next

    rs.Close

   Cbx_Fields.ListIndex = 0

End Sub

應用三:如何將一個ComboBox控制元件放到Toolbar控制元件

Toolbar控制元件可以擺放任意Button控制元件。方法都是用Add方法將Button物件新增到Toolbar控制元件中去。每個按鈕的狀態都由Style屬性決定。

例如執行程式Combo1控制元件自動新增到Toolbar1工具欄上。

最終效果如圖10所示。

圖10  將一個ComboBox控制元件放到Toolbar控制元件

★★★★★  Form1  ★★★★★★

程式程式碼如下:

'窗體啟動時將一個ComboBox控制元件放到Toolbar控制元件

Private Sub Form_load()

    Dim btnAs Button        '宣告Button型別變數

   Combo1.AddItem "LOVING"    '新增列表項

   Combo1.AddItem "李小蔥"

   Combo1.AddItem "蔥蔥"

   Combo1.Text = "loving"            '設定下拉列表項當前內容

    Me.Show          '顯示窗體

    Set btn= Toolbar1.Buttons.Add()        '新增Button

   btn.Style = tbrSeparator             '設定Button型別

    Set btn= Toolbar1.Buttons.Add()        '新增Button

   btn.Style = tbrPlaceholder          '設定Button型別

    btn.Key= "ComboBox"             '設定關鍵字

   btn.Width = 1000                      '設定寬度

    Set btn= Toolbar1.Buttons.Add  '新增Button

   btn.Style = tbrDefault    '設定Button型別

    Set btn= Toolbar1.Buttons.Add  '新增Button

   btn.Style = tbrDefault    '設定Button型別

    SetCombo1.Container = Toolbar1設定Combo1的所在容器

   Combo1.ZOrder 0   '設定Combo1位於圖層頂端

   Combo1.Width = Toolbar1.Buttons("ComboBox").Width   '設定Combo1寬度

   Combo1.Top = Toolbar1.Buttons("ComboBox").Top         '設定Combo1頂端座標

   Combo1.Left = Toolbar1.Buttons("ComboBox").Left         '設定Combo1左端座標

   Combo1.Visible = True                                                   'Combo1可見

End Sub

應用四:注意ComboBox控制元件的只讀屬性

在“工作日誌管理”窗體中,單擊工具欄上的“新增”按鈕新增工作日誌資訊時(如圖11所示),彈出如圖12所示的錯誤提示資訊。

圖11  單擊工具欄上的“新增”按鈕新增工作日誌資訊

圖12  在新增工作日誌資訊時彈出的錯誤提示資訊

在新增工作日誌資訊時,需要將“日誌型別”下拉列表框中的內容清空。“ComboBox”控制元件的“Style”屬性有3個屬性值,即“0-Dropdown Combo”、“1-Simple Combo”和“2-Dropdown List”。當將“Style”屬性設定為“2-Dropdown List”時,“ComboBox”控制元件的“Text”屬性被設為只讀,將無法再為控制元件的“Text”屬性賦值,所以在新增工作日誌資訊時,一旦給“ComboBox”控制元件的“Text”屬性賦予空值,就會彈出錯誤提示。解決的方法是在“ComboBox”控制元件的屬性視窗中將“ComboBox”控制元件的“Style”屬性設定為“0-Dropdown”,如圖13所示。

圖13  設定“ComboBox”控制元件的“Style”屬性