ComboBox

ComboBox

hwndCtl為此組合框的句柄,lpsz為需要添加的字元串,組合框不能直接通過id添加內容,所以需要得到這個控制項的句柄,還得使用GetDlgItem()函數.

C++


添加內容

ComboBox_AddString(hwndCtl,lpsz)
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
//建立一個組合框,ID可以設置為IDC_C1,然後通過GetDlgItem獲取這個組合框的句柄
//如果無法正常顯示,需要調整此組合框的最大顯示範圍,在向下箭頭上出現上下箭頭時可以調整.
ComboBox_AddString(hwndCombo1,TEXT("內容1"));
ComboBox_AddString(hwndCombo1,TEXT("內容2"));
//使用IDC_C1的句柄hwndCombo1,然後添加內容,多次調用可以設置多項文字,
//添加的內容通常都放在Main_OnInitDialog()初始化函數中,也可以通過按鈕或其他控制項調用.

獲取項目個數

ComboBox_GetCount(hwndCtl)
這個函數的返回值為int,參數hwndCtl為此組合框控制項句柄;
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
int count = ComboBox_GetCount(hwndCombo1);
//通過定義count拿到返回值.

刪除內容

ComboBox_DeleteString(hwndCtl, index)
hwndCtl為句柄,index為項目索引號,從上至下,從0開始排列,所以0就是刪除第一項.
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
ComboBox_DeleteString(hwndCombo1,0);

獲取索引號

ComboBox_GetCurSel(hwndCtl)
此函數的返回值為int,返回項目索引號.
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
int count = ComboBox_GetCurSel(hwndCombo1);
//獲取到索引號.
TCHAR str1[256];
sprintf(str1,"當前選中的項索引號為:%d",count);
//使用sprintf儲存說明文字跟索引號,
MessageBox(hwnd,str1,TEXT("標題"),MB_OK);
ComboBox_DeleteString(hwndCombo1,count);
//刪除獲取此索引號的項.
MessageBox(hwnd,TEXT("刪除當前選中的項"),TEXT("標題"),MB_OK);
//為選中並刪除當前項,如果沒有選中任何項,返回值為-1.

給定選中並顯示值

ComboBox_SetCurSel(hwndCtl, index)
位置的編號由0開始,0表示第一項
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
ComboBox_SetCurSel(hwndCombo1,2);
//選擇並顯示第3項

給定並顯示值

ComboBox_GetLBText(hwndCtl, index, lpszBuffer)
hwndCtl句柄,index索引號,lpszBuffer儲存字元串
舉例:
HWND hwndCombo1 = GetDlgItem(hwnd,IDC_C1);
CString str;
ComboBox_GetLBText(hwndCombo1,2, str);
//ComboBox_GetLBText不返回值,實際是通過str儲存並傳遞字元串.
MessageBox(hwnd,str,TEXT("標題"),MB_OK);
//輸出某項的str字元串的值.

VB控制項


VB中,Combo Box(組合框)控制項很簡單也很常用,可以節省空間。從用戶角度來看,這個控制項是由一個文本輸入控制項和一個下拉菜單組成的。用戶可以從一個預先定義的列表裡選擇一個選項,同時也可以直接在文本框裡面輸入文本。

改變下拉框大小

1)直接在控制項上操作,先點向下的箭頭,就可以調整下拉框大小;
2)為了讓列表框變的更寬,可以用setdroppedwidth(int width)函數來調整列表框的寬度。

定義控制項對應變數

假定已經創建了一個Dialog,並且從控制項工具箱將Combo Box 控制項拖放到上面。打開 Class Wizard,添加控制項對應變數,如:CComboBox m_combo。

向控制項添加 Items

1)在Combo Box控制項屬性的Data標籤裡面添加,一行表示Combo Box下拉列表中的一行。換行用ctrl+回車。若在VS2005中,Items間用";"隔開即可;
2)利用函數 AddString()向 Combo Box 控制項添加Items,如:
m_combo.AddString(“StringData1”);
m_combo.AddString(“StringData2”);
m_combo.AddString(“StringData3”);
3) 也可以調用函數 InsertString() 將 Item 插入指定位置 nIndex,如:
m_combo.InsertString(nIndex, “StringData” );
4)int GetCount( )可以得到當前列表框中行的數量。
示例代碼:程序初始化時動態添加Items
CString strTemp;
m_combo.ResetContent();//消除現有所有內容
for(inti=1;i<=100;i++)
{
strTemp.Format("%d",i);
m_combo.AddString(strTemp);
}

從控制項得到選定的Item

假設在控制項列表中已經選定某項,現在要得到被選定項的內容,首先要得到該項的位置,然後得到對應位置的內容。這裡會用到兩個函數,如:
int nIndex = m_combo.GetCurSel();
CString strText;
m_combo.GetLBText( nIndex, strText);
這樣,得到的內容就保存在 strText 中。若要選取當前內容,可調用函數GetWindowText(strText)。

在控制項中查找給定Item

這種操作一般用於在程序中動態修改控制項中該項的值,可以用函數FindStringExact() 精確匹配,如:
int nIndex =m_combo.FindStringExact( nStartAfter, “value to befound”);
nStartAfter指明從哪一行開始查找。如果查找成功,返回的是該項的位置;否則,返回CB_ERR。
也可以選中包含指定字元串的項,如:
int nIndex =m_combo.SelectString( nStartAfter, “value to beselected”);

刪除控制項中的Item

該操作可以利用函數DeleteString(),需要指定被刪除項的位置,如:
m_combo.DeleteString(nIndex);
也可以使用函數ResetContent(),清除目前的所有項,如:
m_combo.ResetContent();

顯示控制項中的某項

int nIndex =m_combo.GetCurSel(); //當前選中的項
m_combo.SetCurSel(nIndex); //設置第nIndex項為顯示的內容

取得Combo Box框內容

1)取當前內容
m_combo.GetWindowText(strTemp);
2)取其他行內容
m_combo.GetLBText(n,strTemp);

獲得焦點

通常要判斷控制項是否獲得了焦點,可以用GetFocus()函數,例如:
if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判斷焦點是否在編輯框IDC_EDIT_VALUE2內。
但是combobox 的焦點不同,因為它是由edit和listbox兩部分組成,所以獲得焦點要用GetParent(),例如:
if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))。

設置控制項屬性

1)Sort 屬性:設置為 true,則新添加項將按字母順序插入到列表中;否則,在列表的結尾處插入項。
2)Type屬性:設置為Drop List,則使ComboBox不能輸入只能在下拉菜單中選擇;設置Dropdown,則ComboBox中允許輸入內容。
3)No integral height屬性,表示最大長度為設計長度,如果實際內容比設計長度多,就出現滾動條,少就以實際長度顯示。
得到或設置輸入框中被選中的字元位置
1)DWORD GetEditSel() /BOOL SetEditSel( int nStartChar, int nEndChar );//得到或設置輸入框中被選中的字元位置。
2)BOOL LimitText(int nMaxChars );//設置輸入框中可輸入的最大字元數。

常用的消息映射宏

ON_CBN_DBLCLK 滑鼠雙擊
ON_CBN_DROPDOWN 列表框被彈出
ON_CBN_KILLFOCUS /ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生
ON_CBN_SELCHANGE 列表框中選擇的行發生改變
ON_CBN_EDITUPDATE 輸入框中內容被更新
使用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( );的函數,並且定義形式如ON_Notification( id, memberFxn )的消息映射。如果在對話框中使用組合框,Class Wizard會自動列出相關的消息,並能自動產生消息映射代碼。

.NET


在.NET的Server Control中只有DropDownList,而不像Win Form編程一樣有ComboBox,但是AjaxControlToolkit中提供了ComboBox,可以提供文本輸入功能,並且有SuggestAppend功能。
Textbox不同的是,ComboBox.Text屬性並不能取得文本框中的文本,此屬性與ComboBox.SelectedValue完全等同,只能獲得下拉列表中的Value。如果想獲得ComboBox文本框中的文本,只能通過ComboBox.Controls屬性來讀取。
((TextBox)((Table)ComboBoxComponent.Controls[0]).Rows[0].Cells[0].Controls[0]).Text
這就是ComboBox中自己輸入的文本。
循環初始化ComboBox的例子:
private void initComboBox()
{
for (int i = 0; i < 24; i++)
{
comboHour.Items.Add(i.ToString());
comboHour.SelectedIndex = 0; //設置第一個被選中
}
}

VFP控制項


組合框(combobox)

組合框和列表框的功能類似,但使用更為靈活,更為常用。實際上,組合框是由一個文本框和一個列表框組成的,組合框又被稱為彈出式菜單。用戶使用時,單擊文本框右側的三角即可展開下拉列表。

組合框常用的屬性

屬性 作用
rowsource 組合框內容從何處來(來源)
rowsourcetype 組合框內容來源的類型,詳見注1
displayvalue 選擇值
boundcolumn 在組合框包含多項時指定哪一列作為value屬性的值
columncount 行源列數
list(i) 第i行的值
selected(i) 第i行是否被選中
multiselect 是否可以同時選取多項
moverbars 項目是否可以移動
sorted 當rowsourcetype為0和1時,組合框內容是否按字母大小排序
listindex 組合框中當前被選定項的索引值
integralheight 組合框的高度是否可自動調整
listcount 組合框中數據項的數目
style 指定組合框的類型。參數如下:0-下拉組合框,也可在文本框中直接輸入 2-下拉列表框,只能在展開的下拉列表中選擇
incrementalsearch 確定在鍵盤操作時是否支持增量搜索。值為.T.,當用鍵盤選擇列表項,用戶敲一個鍵,系統將自動定位到與輸入字母相應的項前
注1(rowsourcetype屬性可指定的值):
0-無,運行時使用列表框的確良additem和addlistitem方法加入
1-值,將列表框的內容在設計時直接寫在該屬性中
2-表別名:由columncount確定表中選擇的欄位。當用戶選擇列表框時,記錄指針將自動移到該記錄上
3-sql語句:見sql部分,由執行的結果產生.
4-查詢文件名:見查詢部分,由查詢結果產生
5-數組名
6-欄位名表:可用表別名作為欄位前綴。當用戶選擇列表項時,記錄指針將自動移到該記錄上
7-文件名描述框架,可包含"*"和"?"來描述在列表框中顯示的文件名
8-結構
9-彈出式菜單,提供向後兼容.

組合框常用的方法

方法 作用
additem 增加列表項
removeitem 移去列表項
clear 移去所有列表項
requery 當rowsourcetype為3和4時,根據rowsource中的最新數據重新刷新列表項

組合框常用事件

列表框的常用事件為click(單擊)事件、dbclick(雙擊)事件和interactivechange事件(當用戶使用鍵盤或滑鼠更改組合框的值時發生的事件,比如,我們單擊組合框右側的三角展開下拉列表時,即會發生此事件)。