在一些場合裏面,咱們須要對一些記錄進行顏色標註處理,以標記記錄的信息重要性或者進行類別區分,如在客戶關係管理系統裏面,咱們須要對客戶信息進行不一樣顏色的標註,方便對不一樣類別的管理,畢竟顏色區分仍是比較直觀快速的一種。本隨筆介紹在咱們的CRM客戶關係管理系統中,對客戶信息的標註處理和顯示區分的實現。數據庫
在一個CRM客戶關係管理系統裏面,客戶信息的種類比較多,用來標記不一樣類別,同時也是方便咱們對不一樣類別信息進行的快速篩選查詢,以下是客戶關係管理系統裏面對於客戶信息的展現,左邊樹形列表裏面,列出不少客戶屬性的類別。函數
如客戶狀態、客戶類型、客戶級別、客戶行業等等不一樣的屬性分類,除了這些分類,咱們還能夠對客戶記錄進行顏色標註,這樣能夠更加直觀區分這個客戶屬於那種特定的類型,爲了方便,咱們預設幾種比較好區分的顏色進行處理便可,不須要設計太多的顏色,以便以7個爲標準就能夠了,太多也沒有意義。字體
在編輯客戶信息的時候,咱們能夠設置該記錄的顏色選項,以下面界面所示。this
設置了不一樣類別顏色的客戶信息後,咱們能夠在記錄的行裏面用不一樣的顏色進行區分顯示,這樣看起來就更加直觀了。編碼
下面咱們來看看具體的實現過程代碼。spa
在編輯界面添加相關的標籤控件和一個下拉按鈕的控件,以下界面所示。設計
其中標註顏色的下拉按鈕是DevExpress的DropDownButton控件。3d
初始化建立下拉按鈕的代碼以下所示。code
/// <summary> /// 建立標記顏色的下拉按鈕 /// </summary> /// <returns></returns> private DXPopupMenu CreateDXPopupMenu() { var menu = new DXPopupMenu(); var dict = ColorHelper.ColorDict; foreach(string key in dict.Keys) { menu.Items.Add(CreateMenuItem(key, dict[key])); } //menu.Items.Add(CreateMenuItem("橙色", Color.Orange)); //menu.Items.Add(CreateMenuItem("黃色", Color.Yellow)); //menu.Items.Add(CreateMenuItem("綠色", Color.Green)); //menu.Items.Add(CreateMenuItem("藍色", Color.Blue)); //menu.Items.Add(CreateMenuItem("紫色", Color.Purple)); //menu.Items.Add(CreateMenuItem("黑色", Color.Black)); return menu; }
其中咱們在重構的時候,移除了硬編碼的顏色記錄,改用一個輔助類來處理顏色字典,這樣能夠方便修改。orm
internal static class ColorHelper { private static Dictionary<string, Color> colorDict = new Dictionary<string, Color>(); static ColorHelper() { colorDict.Add("紅色", Color.Red); colorDict.Add("橙色", Color.Orange); //colorDict.Add("黃色", Color.Yellow); colorDict.Add("綠色", Color.Green); colorDict.Add("藍色", Color.Blue); colorDict.Add("紫色", Color.Purple); colorDict.Add("黑色", Color.Black); colorDict.Add("無", Color.Empty); } /// <summary> /// 顏色字典 /// </summary> public static Dictionary<string, Color> ColorDict { get { return colorDict; } } }
建立按鈕並添加對應的單擊事件代碼
private DXMenuItem CreateMenuItem(string text, Color color) { var item = new DXMenuItem(text, OnItemClick); item.Appearance.BackColor = color; return item; } private void OnItemClick(object sender, EventArgs e) { DXMenuItem item = sender as DXMenuItem; if(item != null) { this.lblMarkColor.BackColor = item.Appearance.BackColor; //更新顏色 string color = ColorTranslator.ToHtml(this.lblMarkColor.BackColor); if(!string.IsNullOrEmpty(ID)) { BLLFactory<Customer>.Instance.MarkColor(ID, color); } } }
其中咱們注意到了,咱們使用
ColorTranslator.ToHtml
函數來轉換對應的顏色代碼到一個字符串來存儲數據庫裏面,這個函數是系統內輔助類的函數。
當咱們須要展現字符串的顏色信息,須要把它轉換爲對應的顏色枚舉,以下所示。
//標記顏色 if (!string.IsNullOrEmpty(info.MarkColor)) { this.lblMarkColor.BackColor = ColorTranslator.FromHtml(info.MarkColor); }
在列表界面 裏面,若是咱們須要設置某個單元格顏色信息,那麼咱們經過添加這個實現就能夠。
this.winGridViewPager1.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle);
void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e) { string columnName = e.Column.FieldName; if (columnName == "Name") { bool deleted = (bool)this.winGridViewPager1.gridView1.GetRowCellValue(e.RowHandle, "Deleted"); Color color = Color.White; if (deleted) { e.Appearance.BackColor = Color.Red; e.Appearance.BackColor2 = Color.LightCyan; } //根據用戶選擇的標記顏色,設置單元格的顏色信息 string markcolor = string.Concat(this.winGridViewPager1.gridView1.GetRowCellValue(e.RowHandle, "MarkColor")); if(!string.IsNullOrEmpty(markcolor)) { color = ColorTranslator.FromHtml(markcolor); e.Appearance.BackColor = color; e.Appearance.BackColor2 = Color.White; } } }
在客戶信息的左側樹形列表裏面,咱們初始化了一個標記顏色的樹形列表,這裏也是根據顏色信息進行一個條件的處理便可。
初始化樹形列的代碼以下所示。
//標記顏色的樹形列表展現 var colorNode = new TreeNode("標記顏色", 0, 0); this.treeView1.Nodes.Add(colorNode); var dict = ColorHelper.ColorDict; foreach (string key in dict.Keys) { TreeNode subNode = new TreeNode(key, 9, 9); var color = ColorTranslator.ToHtml(dict[key]); string filter = ""; if (string.IsNullOrEmpty(color)) { filter += "(MarkColor ='' or MarkColor is null) "; } else { filter = string.Format("{0}='{1}' ", "MarkColor", color); } subNode.Tag = filter; //增長數值 //若是過濾條件不爲空,那麼須要進行過濾 if (!string.IsNullOrEmpty(this.ShareUserCondition)) { filter = string.Format(" {0} AND {1}", this.ShareUserCondition, filter); } int count = BLLFactory<Customer>.Instance.GetRecordCount(filter); subNode.Text += string.Format("({0})", count); //避免透明不顯示字體 subNode.ForeColor = dict[key]; colorNode.Nodes.Add(subNode); }
這樣咱們就能夠根據樹節點的條件來進行過濾數據了。
咱們再來回顧下列表界面的總體狀況。