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); } } }
取值還是跟前面的方法一致。