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 GetEnumWithKey(T t, string groupName)

{

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(T t)

{

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 selectItems = new List();

接著我們需要定義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是否有值,如果沒有就把第一個選中,然後遍歷這個選中的指標項,然後在命令視窗上打印出來,我們來看最終效果:

獲取指標項

這樣就拿到了使用者多選的指標項,接下來就可以在專案中使用這些指標項做之後的操作。你學會了嗎?

今天的分享就到這裡,如果對你有幫助或者啟發的話,請給我一個贊或者評論鼓勵下我,你的支援是我不斷更新的動力。

相關文章