開發(fā)指南 - 基于多頁面的數(shù)據(jù)處理)
我們在做WinForm項目開發(fā)的時候經(jīng)常會發(fā)現(xiàn)有一些數(shù)據(jù)很多需要通過不同的Tab頁面分類來實現(xiàn)數(shù)據(jù)的錄入和現(xiàn)實例如體檢數(shù)據(jù)可能包含外科、內(nèi)科、眼科、耳鼻喉科、口腔科、以及其他的檢查等等內(nèi)容如果一次性放在一個窗口中現(xiàn)實不太合理也不好看如果通過多個Tab分類進行管理則用戶體驗好很多。PS給大家推薦一個C#開發(fā)可以用到的界面組件——DevExpress WinForms它能完美構(gòu)建流暢、美觀且易于使用的應用程序無論是Office風格的界面還是分析處理大批量的業(yè)務數(shù)據(jù)它都能輕松勝任DevExpress新舊版本幫助文檔獲取可點擊這篇文章查看——《界面控件DevExpress v26.1幫助文檔大全CHM版本》如果分為多個Tab頁面進行數(shù)據(jù)管理最好的方法是每個頁面負責自己的數(shù)據(jù)存儲及顯示由于數(shù)據(jù)可能是關(guān)聯(lián)的存儲需要使用事務。保存的時候可能每項都會有檢查數(shù)據(jù)是否完備及有效性。那么我們應該實現(xiàn)類似這樣的界面操作呢。如上分析我們把每個模塊獨立出來做一個控件如眼科的作為一個獨立的用戶控件進行展現(xiàn)如下所示。其他模塊也一樣處理獨立作為一個用戶控件然后再在一個主窗體界面中進行整合即可。為了對窗體能夠?qū)崿F(xiàn)批量處理我們需要為每個用戶控件定義一個接口他們之間都需要實現(xiàn)這些約定的接口接口如下所示。interface IDataApply { /// summary /// 設置控件的重要屬性 /// /summary /// param nameid記錄ID/param /// param namepilotId飛行人員ID/param /// param nameisNewData是否為新建記錄/param void SetData(string id, string pilotId, bool isNewData); /// summary /// 數(shù)據(jù)顯示的函數(shù) /// /summary void DisplayData(); /// summary /// 用于模塊事務性提交數(shù)據(jù) /// /summary /// param nametrans事務對象/param /// returns/returns bool Apply(DbTransaction trans); /// summary /// 檢查輸入的有效性 /// /summary /// returns有效/returns bool CheckInput(); }這樣獨立的用戶控件需要繼承接口實現(xiàn)接口約定的內(nèi)容。public partial class EyeControl : DevExpress.XtraEditors.XtraUserControl, IDataApply我們來看其中一個TabPage的模塊接口實現(xiàn)代碼如下所示。#region IDataApply 成員 /// summary /// 檢查輸入的有效性 /// /summary /// returns有效/returns public bool CheckInput() { bool result true;//默認是可以通過 if (this.txtCheckDate.Text.Length 0) { MessageDxUtil.ShowTips(請輸入體檢結(jié)論日期); 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 /// 數(shù)據(jù)顯示的函數(shù) /// /summary public void DisplayData() { InitDictItem();//數(shù)據(jù)字典加載公用 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 /// 用于模塊事務性提交數(shù)據(jù) /// /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其中我們注意到各模塊的數(shù)據(jù)顯示及保存都是自治的這樣除了較好管理數(shù)據(jù)顯示及保存外也使得主界面整合更加簡潔方便。在主編輯界面中我們需要逐一對各個控件的檢查以及數(shù)據(jù)保存及顯示等操作進行處理具體我們可以通過遍歷進行處理。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顯示每個控件負責的數(shù)據(jù)操作代碼如下所示。/// summary /// 顯示數(shù)據(jù)到控件上 /// /summary public virtual void DisplayData() { InitDictItem();//數(shù)據(jù)字典加載公用 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采用事務性保存數(shù)據(jù)的實現(xiàn)代碼如下所示。/// summary /// 保存數(shù)據(jù)新增和編輯的保存 /// /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; }實現(xiàn)以上的操作基本上對控件的數(shù)據(jù)管理就差不多了這樣比我們把全部雞蛋放到一個籃子里面處理會顯得更加清晰更加高效重要的是減少出錯的機會否則想想看如果操作的數(shù)據(jù)字段內(nèi)容上百個保存顯示檢查這些操作是不是很容易漏掉或者出現(xiàn)錯誤呢。況且把每部分雞蛋放到一個小籃子里面我們管理就是小籃子這樣管理的對象減少了效率也就提高了。以上就是對于多個Tab頁面的數(shù)據(jù)處理解決方案應該對大家有一定的啟發(fā)意義。本文轉(zhuǎn)載自博客園 - 伍華聰