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”屬性