
我們在做WinForm項目開發的時候經常會發現有一些數據很多需要通過不同的Tab頁面分類來實現數據的錄入和現實例如體檢數據可能包含外科、內科、眼科、耳鼻喉科、口腔科、以及其他的檢查等等內容如果一次性放在一個窗口中現實不太合理也不好看如果通過多個Tab分類進行管理則用戶體驗好很多。PS給大家推薦一個C#開發可以用到的界面組件——DevExpress WinForms它能完美構建流暢、美觀且易于使用的應用程序無論是Office風格的界面還是分析處理大批量的業務數據它都能輕松勝任DevExpress新舊版本幫助文檔獲取可點擊這篇文章查看——《界面控件DevExpress v26.1幫助文檔大全CHM版本》如果分為多個Tab頁面進行數據管理最好的方法是每個頁面負責自己的數據存儲及顯示由于數據可能是關聯的存儲需要使用事務。保存的時候可能每項都會有檢查數據是否完備及有效性。那么我們應該實現類似這樣的界面操作呢。如上分析我們把每個模塊獨立出來做一個控件如眼科的作為一個獨立的用戶控件進行展現如下所示。其他模塊也一樣處理獨立作為一個用戶控件然后再在一個主窗體界面中進行整合即可。為了對窗體能夠實現批量處理我們需要為每個用戶控件定義一個接口他們之間都需要實現這些約定的接口接口如下所示。interface IDataApply { /// summary /// 設置控件的重要屬性 /// /summary /// param nameid記錄ID/param /// param namepilotId飛行人員ID/param /// param nameisNewData是否為新建記錄/param void SetData(string id, string pilotId, bool isNewData); /// summary /// 數據顯示的函數 /// /summary void DisplayData(); /// summary /// 用于模塊事務性提交數據 /// /summary /// param nametrans事務對象/param /// returns/returns bool Apply(DbTransaction trans); /// summary /// 檢查輸入的有效性 /// /summary /// returns有效/returns bool CheckInput(); }這樣獨立的用戶控件需要繼承接口實現接口約定的內容。public partial class EyeControl : DevExpress.XtraEditors.XtraUserControl, IDataApply我們來看其中一個TabPage的模塊接口實現代碼如下所示。#region IDataApply 成員 /// summary /// 檢查輸入的有效性 /// /summary /// returns有效/returns public bool CheckInput() { bool result true;//默認是可以通過 if (this.txtCheckDate.Text.Length 0) { MessageDxUtil.ShowTips(請輸入體檢結論日期); this.txtCheckDate.Focus(); return false; } return result; } /// summary /// 設置控件的重要屬性 /// /summary /// param nameid記錄ID/param /// param namepilotId飛行人員ID/param /// param nameisNewData是否為新建記錄/param public void SetData(string id, string pilotId, bool isNewData) { this.ID id; this.Pilot_ID pilotId; this.IsNewData isNewData; } /// summary /// 數據顯示的函數 /// /summary public void DisplayData() { InitDictItem();//數據字典加載公用 if (!this.IsNewData) { #region 顯示客戶信息 LargeCheckConclusionInfo info BLLFactoryLargeCheckConclusion.Instance.FindByID(ID); if (info ! null) { txtCheckDate.DateTime info.CheckDate; txtDiagnosis.Text info.Diagnosis; txtResult.Text info.Result; txtSuggestion.Text info.Suggestion; txtHealthLevel.Text info.HealthLevel; txtHospital.Text info.Hospital; } #endregion } else { } } /// summary /// 用于模塊事務性提交數據 /// /summary /// param nametrans事務對象/param /// returns/returns public bool Apply(DbTransaction trans) { this.trans trans; bool result false; if (!this.IsNewData) { //編輯的保存 result SaveUpdated(); } else { //新增的保存 result SaveAddNew(); } return result; } #endregion其中我們注意到各模塊的數據顯示及保存都是自治的這樣除了較好管理數據顯示及保存外也使得主界面整合更加簡潔方便。在主編輯界面中我們需要逐一對各個控件的檢查以及數據保存及顯示等操作進行處理具體我們可以通過遍歷進行處理。1檢查控件輸入的部分如下代碼所示。/// summary /// 檢查輸入的有效性 /// /summary /// returns有效/returns public virtual bool CheckInput() { bool result true;//默認是可以通過 if (this.txtPilot.PilotID.Trim().Length 0) { MessageDxUtil.ShowTips(請選擇飛行人員); this.txtPilot.Focus(); result false; } //檢查輸入是否正確 foreach (XtraTabPage page in this.xtraTabControl1.TabPages) { foreach (Control control in page.Controls) { IDataApply apply control as IDataApply; if (apply ! null) { apply.SetData(ID, this.txtPilot.PilotID, IsNewData); result apply.CheckInput(); if (!result) { this.xtraTabControl1.SelectedTabPage page; control.Focus(); } } } } return result; }2顯示每個控件負責的數據操作代碼如下所示。/// summary /// 顯示數據到控件上 /// /summary public virtual void DisplayData() { InitDictItem();//數據字典加載公用 foreach (XtraTabPage page in this.xtraTabControl1.TabPages) { foreach (Control control in page.Controls) { IDataApply apply control as IDataApply; if (apply ! null) { apply.SetData(ID, Pilot_ID, IsNewData); apply.DisplayData(); } } } }3采用事務性保存數據的實現代碼如下所示。/// summary /// 保存數據新增和編輯的保存 /// /summary public virtual bool SaveEntity() { bool result false; DbTransaction trans BLLFactoryLargeCheckConclusion.Instance.CreateTransaction(); if (trans ! null) { try { foreach (XtraTabPage page in this.xtraTabControl1.TabPages) { foreach (Control control in page.Controls) { IDataApply apply control as IDataApply; if (apply ! null) { apply.SetData(ID, this.txtPilot.PilotID, IsNewData); apply.Apply(trans); } } } if (trans ! null) { trans.Commit(); result true; } } catch (Exception ex) { if (trans ! null) { trans.Rollback(); } LogHelper.Error(ex); MessageDxUtil.ShowError(ex.Message); return false; } } return result; }實現以上的操作基本上對控件的數據管理就差不多了這樣比我們把全部雞蛋放到一個籃子里面處理會顯得更加清晰更加高效重要的是減少出錯的機會否則想想看如果操作的數據字段內容上百個保存顯示檢查這些操作是不是很容易漏掉或者出現錯誤呢。況且把每部分雞蛋放到一個小籃子里面我們管理就是小籃子這樣管理的對象減少了效率也就提高了。以上就是對于多個Tab頁面的數據處理解決方案應該對大家有一定的啟發意義。本文轉載自博客園 - 伍華聰