Winform界面基於多頁面數據的處理實現


我們在做Winform項目開發的時候,經常會發現有一些數據很多,需要通過不同的Tab頁面分類來實現數據的錄入和現實,例如體檢數據,可能包含外科、內科、眼科、耳鼻喉科、口腔科、以及其他的檢查等等內容,如果一次性放在一個窗口中現實,不太合理也不好看,如果通過多個Tab分類進行管理,則用戶體驗好很多。

如果分為多個Tab頁面進行數據管理,最好的方法是,每個頁面負責自己的數據存儲及顯示,由於數據可能是關聯的,存儲需要使用事務。保存的時候,可能每項都會有檢查數據是否完備及有效性。那么我們應該實現類似這樣的界面操作呢。

如上分析,我們把每個模塊獨立出來做一個控件,如眼科的作為一個獨立的用戶控件進行展現,如下所示。

其他模塊也一樣處理,獨立作為一個用戶控件,然后再在一個主窗體界面中進行整合即可。

為了對窗體能夠實現批量處理,我們需要為每個用戶控件定義一個接口,他們之間都需要實現這些約定的接口,接口如下所示。

    interface IDataApply
    {
        /// <summary>
        /// 設置控件的重要屬性
        /// </summary>
        /// <param name="id">記錄ID</param>
        /// <param name="pilotId">飛行人員ID</param>
        /// <param name="isNewData">是否為新建記錄</param>
        void SetData(string id, string pilotId, bool isNewData);

        /// <summary>
        /// 數據顯示的函數
        /// </summary>
        void DisplayData();

        /// <summary>
        /// 用於模塊事務性提交數據
        /// </summary>
        /// <param name="trans">事務對象</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 name="id">記錄ID</param>
        /// <param name="pilotId">飛行人員ID</param>
        /// <param name="isNewData">是否為新建記錄</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 = BLLFactory<LargeCheckConclusion>.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 name="trans">事務對象</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 = BLLFactory<LargeCheckConclusion>.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頁面的數據處理解決方案,應該對大家有一定的啟發意義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM