DevExpress——手把手教你學會CheckedListBoxControl的使用方案
CheckedListBox是一個多選擇器控制元件,是DevExpress提供的用以解決多選情況下的解決方案。
首先,我們需要一個面板Panel承載CheckedListBox,Panel使用DevExpress提供的PanelControl控制元件,設定停靠方式為在父容器上停靠,用程式碼控制為:this。PanelControl1。Dock=DockStyle。Fill,然後將CheckedListBox拖拽到Panel面板上,設定停靠方式為在父容器上停靠,最終效果如下即為正確:
新建CheckedListControl
於是,我們需要初始化CheckedListBox,為其中加入我們需要新增的選擇項。第一步我們先清空CheckedListBox的選擇項,這樣做是為了方便下次可以重新整理。程式碼寫為:
this。checkedListBoxControl1。Items。Clear();
接下來我們給CheckedListBox上新增選擇項,當然可以一個一個新增,但是這裡給出的解決方案是定義一個列舉類,先來看這個列舉類怎麼定義的。這裡給出石油生產的相關指標項。
public enum ProdQuotaEnum
{
///
/// 日產油
///
[Display(Name = “日產油水平”)]
[Group(GroupName = “0”)]
DailyOil,
///
/// 單井日產油水平
///
[Display(Name = “單井日產油水平”)]
[Group(GroupName = “0”)]
WellDailyOil,
///
/// 單井日產油能力
///
[Display(Name = “單井日產油能力”)]
[Group(GroupName = “0”)]
WellDailyOilAbility,
///
/// 平均單井日產油
///
[Display(Name = “平均單井日產油水平”)]
[Group(GroupName = “0”)]
AverageDailyOil,
///
/// 綜合含水
///
[Display(Name = “綜合含水”)]
[Group(GroupName = “0”)]
TotalWaterCut,
///
/// 注採比
///
[Display(Name = “注採比”)]
[Group(GroupName = “0”)]
InjProdRatio,
///
/// 綜合生產油氣比
///
[Display(Name = “綜合生產氣油比”)]
[Group(GroupName = “0”)]
CompreProdRatio,
///
/// 原油計量系統誤差(輸差)
///
[Display(Name = “原油計量系統誤差(輸差)”)]
[Group(GroupName = “0”)]
CrudeOilMeteringSystemError}
}
其中Display屬性提供允許實體
分部
類的型別和成員指定可本地化字串的通用特性。Group屬性是分組屬性,可以用於一個列舉類上有多個種類的指標項,這樣就可以篩選出多種選擇項。但是CheckedListBox需要顯示指標內容,於是我們需要獲取列舉類的Display屬性,這樣我們需要額外定義一個工具類:AttributeHelper類。
public static IEnumerable
{
var list = new List
Type type = t。GetType();
if (!type。IsEnum) return list;
foreach (FieldInfo fd in type。GetFields())
{
object[] attrs = fd。GetCustomAttributes(typeof(GroupAttribute), false);
if (attrs != null && attrs。Length > 0 && (attrs[0] as GroupAttribute)。GroupName == groupName)
{
list。Add((T)fd。GetRawConstantValue());
}
} return list;
}
這個方法是根據Group的值來映射出列舉類的Display屬性值,但是用於CheckedListBox顯示出指標內容,那麼我們還需定義一個取display屬性的方法:
public static string GetEnumDisplayName
{
Type type = t。GetType();
if (!type。IsEnum) return string。Empty;
FieldInfo fd = type。GetField(t。ToString());
if (fd == null)
return string。Empty;
object[] attrs = fd。GetCustomAttributes(typeof(DisplayAttribute), false);
string name = string。Empty;
foreach (DisplayAttribute attr in attrs)
{
name = attr。Name;
break;
}
return name;
}
準備好列舉類和取列舉類的屬性工具類之後,就可以新增指標項了。程式碼這樣寫:
var enumList1 = AttributeHelper。GetEnumWithKey(ProdQuotaEnum。AverageDailyOil, “0”); foreach (var item in enumList1) { this。checkedListBoxControl1。Items。Add(new CheckedListBoxItem()
{
Description = AttributeHelper。GetEnumDisplayName(item),
Tag = item
});
}
GetEnumWithKey方法的引數為列舉類,以及Group屬性值,獲取到列舉類之後,然後遍歷這個列表,然後將屬性值一個一個地寫入CheckedListBox,每一個選擇項都是一個CheckedListBoxItem的物件,於是我們可以將Description屬性設為Display屬性,Tag設為每一個列舉類的值。寫好這個我們執行下看下效果:
指標新增
可以看到指標項都新增進去了,然後我們需要進行多選,那麼我們首先定義個迭代屬性物件,用於儲存使用者選擇的指標項。如下:
private IEnumerable
接著我們需要定義CheckedListBox的選擇事件,這裡給出程式碼:
this。checkedListBoxControl1。ItemCheck += CheckedListBoxControl1_ItemCheck;private void CheckedListBoxControl1_ItemCheck(object sender, DevExpress。XtraEditors。Controls。ItemCheckEventArgs e){
this。UpdateSelectItems();
}
這裡給方法裡定義了一個UpdateSelectItems,用於實現使用者每次點選之後程式獲取使用者的選擇項,我們接下來就把這個方法實現下:
private void UpdateSelectItems(){
selectItems = this。checkedListBoxControl1。Items。Where(x => x。CheckState == CheckState。Checked);
if (!selectItems。Any())
this。checkedListBoxControl1。Items[0]。CheckState = CheckState。Checked;
foreach(var item in selectItems)
{
Console。Write(item。Description + “,”);
}
}
在這個方法中,第一行使用Where子句篩選出已經選中的指標項,第二句用於判斷selectItems是否有值,如果沒有就把第一個選中,然後遍歷這個選中的指標項,然後在命令視窗上打印出來,我們來看最終效果:
獲取指標項
這樣就拿到了使用者多選的指標項,接下來就可以在專案中使用這些指標項做之後的操作。你學會了嗎?
今天的分享就到這裡,如果對你有幫助或者啟發的話,請給我一個贊或者評論鼓勵下我,你的支援是我不斷更新的動力。
相關文章
- 2021-09-15後端程式設計Python3-高階程式設計(面向物件-下)
- 2021-09-12總結下ThinkPHP的程式碼審計方法
- 2021-05-20智慧手機的未來……螢幕摺疊2次+拉伸屏
- 2021-04-21最新總結:2021那些小眾精巧的 Python 語法彙總
- 2021-04-15Fluid給資料彈性一雙隱形的翅膀(1)- 自定義彈性伸縮