1. 程式人生 > >C# 公共控制元件之Checkbox和CheckedListBox

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);
                }
            }
        }

 

取值還是跟前面的方法一致。