DevExpress擁有.NET開發需要的所有平臺控制元件,包含600多個UI控制元件、報表平臺、DevExpress Dashboard eXpressApp 框架、適用於 Visual Studio的CodeRush等一系列輔助工具。
在做Winform介面的時候,一般都是統一化處理,介面頂部放置一些欄位條件供查詢,下面就是分頁查詢列表,展示相關的資料。但有時候碰到一些表字段內容分類比較多,有一些特別重要,如果放在一個樹形列表來進行快速分類查詢,使用者體驗應該更好。本文要介紹如何快速實現樹形列表和分頁查詢整合的Winform程式介面。
一、標準Winform列表介面標準的查詢條件+列表資料展示的WInform介面如下所示。
這個介面主要就是透過程式碼生成工具(Database2Sharp)進行初期的Winform介面生成即可。
二、樹形列表和分頁查詢整合的Winform程式介面以上的介面有時候感覺不夠友好,正如文章開頭說到,我需要在左邊放置一些重要的資料分類進行查詢,這樣能夠提高使用者體驗效果,最終希望的介面效果如下所示。
為了實現這種效果,我們需要進行幾部操作。
在標準列表介面上增加視窗分割控制元件(如DevExpress的是SplitContainerControl控制元件)
傳統的Winform介面可以使用SplitContainer控制元件
在現有已生成介面的基礎上,把查詢部分和列表部分的控制元件拖動小一點,然後把上述分隔控制元件拖動到介面後,在右邊面板放入已有的查詢和分頁控制元件部分的內容,中間狀態的列表介面效果如下所示。
然後在左邊放入一個GroupControl控制元件,並加入樹形控制元件TreeView,這樣我們調整後的設計介面效果如下所示。
首先我們需要在程式碼裡面繫結樹的初始化程式碼,生成需要快速查詢的內容,示意程式碼如下所示。主要邏輯思路就是,從資料字典中檢索相關的分類,然後繫結一些查詢條件,方便後面的處理。
private void InitTree(){base.LoginUserInfo = Cache.Instance["LoginUserInfo"] as LoginUserInfo;this.treeView1.BeginUpdate();this.treeView1.Nodes.Clear();//新增一個未分類和全部客戶的組別TreeNode topNode = new TreeNode("所有記錄", 0, 0);this.treeView1.Nodes.Add(topNode);TreeNode CategoryNode = new TreeNode("客戶活動類別", 2, 2);this.treeView1.Nodes.Add(CategoryNode);AddDictData(CategoryNode, 0, "Category");TreeNode OrderYearNode = new TreeNode("記錄年度", 8, 8);this.treeView1.Nodes.Add(OrderYearNode);List<string> yearList = BLLFactory<Maintenace>.Instance.GetYearList();foreach (string year in yearList){TreeNode subNode = new TreeNode(year, 0, 0);subNode.Tag = year;OrderYearNode.Nodes.Add(subNode);}this.treeView1.ExpandAll();this.treeView1.EndUpdate();}
為了處理樹形列表的節點的單擊事件,我們可以在其AfterSelect事件進行處理,示意程式碼如下所示。主要邏輯就是根據及節點和條件的不同,進行不同的處理。
string treeConditionSql = "";private void treeView1_AfterSelect(object sender, TreeViewEventArgs e){if (e.Node != null && e.Node.Tag != null){if (e.Node.FullPath.Contains("記錄年度")){int year = Convert.ToInt32(e.Node.Tag.ToString());SearchCondition condition = new SearchCondition();condition.AddCondition("StartTime", Convert.ToDateTime(string.Format("{0}-01-01", year)), SqlOperator.MoreThanOrEqual);condition.AddCondition("StartTime", Convert.ToDateTime(string.Format("{0}-01-01", year + 1)), SqlOperator.LessThan);treeConditionSql = condition.BuildConditionSql().Replace("Where", "");BindData();}else{treeConditionSql = e.Node.Tag.ToString();BindData();}}else{treeConditionSql = "";BindData();}}
上面的程式碼,我們定義了一個區域性變數treeConditionSql 用來儲存樹列表單擊後的條件,觸發單擊事件後,我們最終還是傳回給標準列表介面已有的查詢操作--BindData函式進行處理。
BindData裡面最主要的操作就是構造查詢條件,構造條件的語句如下所示,透過SearchCondition物件處理進行使用多資料庫的相容處理。
/// <summary>/// 根據查詢條件構造查詢語句/// </summary> private string GetConditionSql(){//如果存在高階查詢物件資訊,則使用高階查詢條件,否則使用主表條件查詢SearchCondition condition = advanceCondition;if (condition == null){condition = new SearchCondition();condition.AddCondition("Category", this.txtCategory.Text.Trim(), SqlOperator.Like);condition.AddCondition("Title", this.txtTitle.Text.Trim(), SqlOperator.Like);condition.AddDateCondition("StartTime", this.txtStartTime1, this.txtStartTime2); //日期型別condition.AddCondition("Contact", this.txtContact.Text.Trim(), SqlOperator.Like);condition.AddCondition("Place", this.txtPlace.Text.Trim(), SqlOperator.Like);}string where = condition.BuildConditionSql().Replace("Where", "");//如果是單擊節點得到的條件,則使用樹列表的,否則使用查詢條件的if (!string.IsNullOrEmpty(treeConditionSql)){where = treeConditionSql;}return where;}
最終繫結資料的函式BindData的邏輯程式碼如下所示。
/// <summary>/// 繫結列表資料/// </summary>private void BindData(){//entitythis.winGridViewPager1.DisplayColumns = "Customer_ID,HandNo,Category,Title,Content,StartTime,EndTime,Contact,ContactPhone,ContactMobile,Place,PlaceAddress,PlacePhone,Note,Editor,EditTime";this.winGridViewPager1.ColumnNameAlias = BLLFactory<Activity>.Instance.GetColumnNameAlias();//欄位列顯示名稱轉義string where = GetConditionSql();List<ActivityInfo> list = BLLFactory<Activity>.Instance.FindWithPager(where, this.winGridViewPager1.PagerInfo);this.winGridViewPager1.DataSource = new WHC.Pager.WinControl.SortableBindingList<ActivityInfo>(list);this.winGridViewPager1.PrintTitle = "客戶活動管理報表";}
這樣我們就完成了樹形列表和分頁查詢整合一起的資料查詢處理邏輯,從而實現我們說需要的結果,這樣的介面在某種程度上,給我們提供更多的方便,更好的體驗。