多文檔窗體的實現----c#之winform界面

   學習c#有一段時間啦,也作過一些實例。now,談談winform. 

在Winform界面中窗體咱們通常使用多文檔進行展現,也就是相似通常的選項卡的方式能夠加載多個窗體界面。通常來講,咱們若是打開新的窗體,給窗體傳遞參數是很容易的事情,可是在框架層面,通常的窗體是經過動態建立的,通常傳入窗體的類型,在多文檔集合裏面判斷,若是存在則激活,若是不存在則建立的方式,因此咱們傳遞參數會碰到一些問題。本文即便介紹如何在這種方式下,給窗體對象傳遞參數,從而實現相應的數據處理功能。 json

無論是主體界面中,左側包含樹形列表,仍是頂部包含工具欄的狀況,均可能涉及打開窗體的時候,傳遞一些初始化參數,方便窗體的更新顯示的狀況,這種的處理相對直接傳值的方式須要複雜一點,咱們能夠經過接口、事件的方式進行處理,下面我來介紹一下整個實現的方式。 c#

一、多文檔窗體的構建或者激活

在個人Winform開發框架裏面,咱們加載多文檔窗體的時候,都是統一採用一種方式來進行構建不存在或者激活已有窗體的,代碼以下所示。 框架

複製代碼
private void tool_Purchase_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { ChildWinManagement.LoadMdiForm(this, typeof(FrmPurchase)); } private void tool_TakeOut_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { ChildWinManagement.LoadMdiForm(this, typeof(FrmTakeOut)); } private void tool_StockSearch_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { ChildWinManagement.LoadMdiForm(this, typeof(FrmStockSearch)); }
複製代碼

而這個LoadMdiForm的函數,主要判斷多文檔集合裏面是否有對應的對象,沒有這建立,有則激活顯示便可,代碼以下所示。 函數

複製代碼
/// <summary> /// 惟一加載某個類型的窗體,若是存在則顯示,不然建立。 /// </summary> /// <param name="mainDialog">主窗體對象</param> /// <param name="formType">待顯示的窗體類型</param> /// <param name="json">傳遞的參數內容,自定義Json格式</param> /// <returns></returns> public static Form LoadMdiForm(Form mainDialog, Type formType, string json) { bool bFound = false; Form tableForm = null; foreach (Form form in mainDialog.MdiChildren) { if (form.GetType() == formType) { bFound = true; tableForm = form; break; } } if (!bFound) { tableForm = (Form) Activator.CreateInstance(formType); tableForm.MdiParent = mainDialog; tableForm.Show(); } tableForm.BringToFront(); tableForm.Activate(); return tableForm; }
複製代碼

這種方式構建的多文檔界面以下所示。 工具

 

二、多文檔窗體傳參數的實現處理

首先,爲了實現這個方式,咱們須要先建立一個接口,是咱們窗體界面的基類,實現這個接口,而後在加載的時候,轉換爲對應的接口處理就能夠了,具體接口代碼以下所示。 學習

複製代碼
/// <summary> /// 使用ChildWinManagement輔助類處理多文檔加載的窗體,在構建或激活後,觸發一個通知窗體的事件,方便傳遞相關參數到目標窗體。 /// 爲了更加通用的處理,傳遞的參數使用JSON定義格式的字符串。 /// </summary> public interface ILoadFormActived { /// <summary> /// 窗體激活的事件處理 /// </summary> /// <param name="json">傳遞的參數內容,自定義JSON格式</param> void OnLoadFormActived(string json); }
複製代碼

這裏參數爲了通用,咱們定義爲字符串的JSON內容,方便實現更增強大的參數處理。 測試

修改好這些,咱們須要在基類窗體 BaseForm 實現這個增長的接口,以下所示。 this

/// <summary> /// 常規界面基類 /// </summary> public partial class BaseForm : XtraForm, IFunction, ILoadFormActived

實現這個接口很容易,爲了更加方便業務窗體(繼承自基類窗體BaseForm),咱們提供一個事件進行處理,具體代碼以下所示。 spa

複製代碼
/// <summary> /// 常規界面基類 /// </summary> public partial class BaseForm : DevExpress.XtraEditors.XtraForm, IFunction, ILoadFormActived { /// <summary> /// 定義一個窗體激活後的處理委託類型 /// </summary> /// <param name="json"></param> public delegate void FormActiveHandler(string json); /// <summary> /// 使用ChildWinManagement輔助類處理多文檔加載的窗體,在構建或激活後,觸發一個通知窗體的事件,方便傳遞相關參數到目標窗體。 /// 爲了更加通用的處理,傳遞的參數使用JSON定義格式的字符串。 /// </summary> public event FormActiveHandler LoadFormActived;
複製代碼

同時,咱們實現接口,就是直接調用事件就能夠了,具體代碼以下所示。 code

複製代碼
/// <summary> /// 窗體激活的事件處理 /// </summary> /// <param name="json">傳遞的參數內容,自定義JSON格式</param> public virtual void OnLoadFormActived(string json) { //默認什麼也沒作 //若是須要處理傳參數,則在這裏處理參數Json便可 if (LoadFormActived != null) { LoadFormActived(json); } }
複製代碼

這樣咱們就完成了基類窗體的處理了,前面咱們介紹了動態構建加載窗體的時候,是使用了LoadMdiForm的函數,既然咱們的接口實現了上面的ILoadFormActived接口,那麼咱們動態建立或者激活窗體的時候,那麼就使用這個接口進行處理一下,以便實現對應事件的處理操做了。所以咱們的窗體加載函數修改代碼,以下所示。

複製代碼
/// <summary> /// 惟一加載某個類型的窗體,若是存在則顯示,不然建立。 /// </summary> /// <param name="mainDialog">主窗體對象</param> /// <param name="formType">待顯示的窗體類型</param> /// <param name="json">傳遞的參數內容,自定義Json格式</param> /// <returns></returns> public static Form LoadMdiForm(Form mainDialog, Type formType, string json) { bool bFound = false; Form tableForm = null; foreach (Form form in mainDialog.MdiChildren) { if (form.GetType() == formType) { bFound = true; tableForm = form; break; } } if (!bFound) { tableForm = (Form) Activator.CreateInstance(formType); tableForm.MdiParent = mainDialog; tableForm.Show(); } //窗體激活的時候,傳遞對應的參數信息  ILoadFormActived formActived = tableForm as ILoadFormActived; if (formActived != null) { formActived.OnLoadFormActived(json); } tableForm.BringToFront(); tableForm.Activate(); return tableForm; }
複製代碼

還記得咱們前面打開一個多文檔窗體的代碼,就是利用這個接口進行建立或者激活指定類型的窗體的,以下所示。

ChildWinManagement.LoadMdiForm(this, typeof(FrmItemDetail));

那麼咱們增長了新的函數參數Json後,咱們若是須要傳遞一個指定的參數給對應的窗體,那麼就修改下調用便可。例以下面,爲了測試,我傳入一個動態構建的類信息,而後轉換爲Json字符串信息給接收窗體,並進行加載窗體。

//使用自定義參數調用 var obj = new { ItemNo = "123456789", ItemName = "測試名稱" }; var param = JsonConvert.SerializeObject(obj, Formatting.Indented); ChildWinManagement.LoadMdiForm(this, typeof(FrmItemDetail), param);

前面咱們介紹了基類窗體,已經實現定義了一個事件,並對這些通知的接口進行處理,具體以下所示。

那麼咱們前面加載的 FrmItemDetail  須要作哪些工做呢,就是實現對事件的處理便可,以下所示。

這樣咱們就可以經過實現對應的事件,把整個通知事件的處理處理完畢了,咱們來看看最終的界面效果,以下所示,接收到的窗體事件後,會彈出一個提示對話框在右下角了。

固然實際上咱們能夠作的更多,如能夠傳遞一些具體的信息,讓它在界面上進行顯示。

如其中一個客戶基於個人Winform開發框架基礎上進行的參數傳遞案例界面如圖:



介紹到這裏
相關文章
相關標籤/搜索