標籤:winform style class blog code http
方案一:
前置說明:
控制項:DEV控制項;
選框:除了“全選”框名字為“ckbAll”,其餘選框名字依次為:“ckb0,ckb1,ckb2,...ckb12”,區分全選框;
事件:選框事件只用Click事件。(在調試過程中,用Changed事件,會出現類似死迴圈的情況)
面板:總14個選框,均在面板:StatusPanel上(這裡將使用迴圈擷取DEV控制項,且是CheckEdit類型時,做單選和全選判定)。
由於技術有限,未能良好運用其他控制項(如CheckBoxList等),
故,使用CheckBox處理全選和反選的演算法如下:
單擊事件有兩類:普通單選框和選項單選框(實際上兩個演算法很相似)。
普通單選框事件演算法:
1 /// <summary> 2 /// 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void ckb_CheckedChanged(object sender, EventArgs e) //OnClick單擊時間 7 { 8 bool isChecked = !((CheckEdit)sender).Checked; //擷取控制項的初始狀態值,未改變狀態之前的值(擷取單擊後的相反值。) 9 foreach (Control ckb in StatusPanel.Controls) //迴圈面板上所有控制項10 {11 if (ckb is DevExpress.XtraEditors.CheckEdit) //控制項是Checkbox時12 {13 if (!((DevExpress.XtraEditors.CheckEdit)ckb).Checked && //控制項未勾選 && 控制項文本名等於選框文本值 && 單擊控制項名不是“全選框”
!((DevExpress.XtraEditors.CheckEdit)ckb).Text.Equals(((CheckEdit)sender).Text) &&
((DevExpress.XtraEditors.CheckEdit)ckb).Name!="ckbAll")14 {15 isChecked = false; //說明選框未全選,賦值false16 break;17 }18 }19 }20 ckbAll.Checked = isChecked; //21 }22 23 /// <summary>24 /// 25 /// </summary>26 /// <param name="sender"></param>27 /// <param name="e"></param>28 private void ckbAll_CheckedChanged(object sender, EventArgs e)29 {30 bool NoneorAll = !ckbAll.Checked;31 foreach (Control ckb in StatusPanel.Controls)32 {33 if (ckb is CheckEdit && ((CheckEdit)ckb).Name!="ckbAll")34 {35 ((CheckEdit)ckb).Checked = NoneorAll;36 }37 }38 }