C# 公共控制元件之Checkbox和CheckedListBox
Winform的開發基本都是基於控制元件事件的,也就是事件驅動型的。
多選框的放置和值的獲取有很多種,這裡介紹幾個簡單常用的方法
1、直接放置Checkbox,並獲取Checkbox的值
上圖
做法也非常簡單,就是在form中放置多個checkbox,然後迴圈遍歷,檢查其checked沒有,然後將checkbox.text拼接到一起,賦值給label,當然實際開發中,我們會將選取的值放入資料庫中。上程式碼
private void button1_Click(object sender, EventArgs e) { string sb = "您的興趣愛好是"; foreach (Control cl in this.Controls)//迴圈整個form上的控制元件 { if (cl is CheckBox)//看看是不是checkbox { CheckBox ck = cl as CheckBox;//將找到的control轉化成checkbox if (ck.Checked)//判斷是否選中 { sb += ck.Text+","; } } } label2.Text = "" + sb.ToString(); }
2、將checkbox放入一個容器內,在容器內做迴圈判斷,這個比較常用,上圖先
跟上面的區別是所有的checkbox都放在groupBox1中了,當然只需要在groupBox1中查詢、判斷就可以了,上程式碼
private void button1_Click(object sender, EventArgs e) { string sb = "您的興趣愛好是"; foreach (Control cl in groupBox1.Controls)//,與上面的區別在這裡哦——迴圈groupBox1上的控制元件 { if (cl is CheckBox)//看看是不是checkbox { CheckBox ck = cl as CheckBox;//將找到的control轉化成checkbox if (ck.Checked)//判斷是否選中 { sb += ck.Text+","; } } } label2.Text = "" + sb.ToString(); }
3、最常規的做法當然是使用CheckedListbox了
CheckedListBox裡面的專案設定可採用靜態和動態載入兩種方法,一般選項固定是會採用靜態設定,選項不固定時,採用從檔案或資料庫讀取,然後載入的方法
(1)先看看靜態設定吧
上圖嘮
對就是這樣的,編輯項或者在屬性items集合裡面設定即可,每行一個即可,然後遍歷取值。
先上兩張圖,給大家區分一個屬性CheckOnClick,左邊的圖是CheckOnClick為false的情況(勾選的時候先反藍,單不勾中,在點一次才能勾中),右邊的圖是勾選一下就可以ok的,但是CheckOnClick得設定成true。
當然後臺判斷是否選中的方法也不一樣,判斷反藍用.GetSelected(i),勾選用.GetItemChecked(i)
對於國人來說,還是一下選中好,所以最好將CheckOnClick設定為true,後臺直接用.GetItemChecked(i)判斷取值即可,上程式碼
private void button1_Click(object sender, EventArgs e)
{
string sb = "您的興趣愛好是";
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (checkedListBox1.GetItemChecked(i))//先判斷是否被選中
{
sb += checkedListBox1.CheckedItems[i].ToString();//將選中的值取出
}
}
label2.Text = sb;
}
(2)動態載入CheckedListBox項
CheckedListBox動態載入就是從數控或者檔案裡面查詢到資料,通過程式碼方式繫結,先上一個簡單的例子
例子一,通過陣列繫結
//將陣列項一一新增到checkedListBox上
String[] arr = new String[] { "足球","籃球","排球"};
for (int i = 0; i < arr.Count(); i++)
{
checkedListBox1.Items.Add(arr[i]);
}
string sb = "您的興趣愛好是";
//取出選中的值
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
if (checkedListBox1.GetItemChecked(i))//先判斷是否被選中
{
sb += checkedListBox1.GetItemText(checkedListBox1.Items[i]);
}
}
label2.Text = sb;
例子二,借鑑園友們的一些做法
CheckedListBox應該是由ListBox擴充套件而來的,但在使用的時候,可能會發現——它不支援DataSource屬性,不能像ListBox那樣指定其資料來源為一個DataTable。
事實上,CheckedListBox像ListBox一樣有DataSource屬性,DisplayMember和ValueMemeber屬性也都是有的,只是IntelliSense不能將其智慧感知出來。園中有朋友說VS2012是支援感知的,不妨可以試一下。
因此,我們可以通過程式碼將CheckedListBox繫結。
DataSet ds=bll.GetAllStudent();
checkedListBox1.DataSource = ds.Table[0];
checkedListBox1.ValueMember = "student_id";
checkedListBox1.DisplayMember = "student_name";
獲取checkedListBox1選中項的DisplayMember和ValueMember
for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
{
DataRowView dv = ((DataRowView)checkedListBox1.CheckedItems[i]);
string id = dv["student_id"].ToString();
string name = dv["student_name"].ToString();
}
4、全選和反選
先上兩張圖
程式碼貼上
//全選框的狀態變化事件
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
checkedListBox1.SetItemChecked(i, true);
}
}
else
{
for (int i = 0; i < checkedListBox1.Items.Count; i++)
{
checkedListBox1.SetItemChecked(i, false);
}
}
}
取值還是跟前面的方法一致。