1. 程式人生 > >談基於.net平臺windows開發中的模式窗體

談基於.net平臺windows開發中的模式窗體

//form.ShowDialog();
form.ShowDialog(this);

對於指定所有者方式開啟的模式窗體可以在模式窗體內部獲取主窗體的引用,
//在模式窗體內部訪問所屬窗體
MainForm form = this.Owner as MainForm;
注意,如果以Form.ShowDialog ()方式開啟,那Form.Owner屬性會是空引用。

談到模式窗體的關閉,先來看一下模式窗體關閉後的返回值。無論是呼叫Form.ShowDialog ()方法還是Form.ShowDialog (IWin32Window)方法,都會在模式窗體關閉時返回System.Windows.Forms.DialogResult列舉值。參考MSDN,該列舉包含的值如下,
DialogResult.Abort,對話方塊的返回值是 Abort(通常從標籤為“中止”的按鈕傳送)。
DialogResult.Cancel,對話方塊的返回值是 Cancel(通常從標籤為“取消”的按鈕傳送)。
DialogResult.Ignore,對話方塊的返回值是 Ignore(通常從標籤為“忽略”的按鈕傳送)。
DialogResult.No,對話方塊的返回值是 No(通常從標籤為“否”的按鈕傳送)。
DialogResult.None,從對話方塊返回了 Nothing。這表明有模式對話方塊繼續執行。
DialogResult.OK,對話方塊的返回值是 OK(通常從標籤為“確定”的按鈕傳送)。
DialogResult.Retry,對話方塊的返回值是 Retry(通常從標籤為“重試”的按鈕傳送)。
DialogResult.Yes,對話方塊的返回值是 Yes(通常從標籤為“是”的按鈕傳送)。
由於某些原因在實際使用者操作中比如選項資料無法儲存,輸入的設定資料有問題,點選[確定]按鈕需要阻止窗體的關閉以對輸入的設定進行調整。對於一些開發者在技術社群貼的阻止模式窗體關閉的程式碼,我認為不是很好的實現。以下用程式碼來描述該實現,注意其中用到了三個事件。
//註冊窗體關閉事件

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.OptionForm_FormClosing);
//註冊確定按鈕事件
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//註冊取消按鈕事件
this.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);

三個事件對應的事件處理程式如下,
//確定按鈕處理程式
private void
buttonOK_Click(object sender, EventArgs e)
{
    //假設textBoxPath用來記錄目錄路徑,如果不存在要求使用者重新設定。
    if (this.textBoxPath.Text.Trim().Length == 0)
    {
        MessageBox.Show("輸入路徑資訊不對!");
        this.textBoxPath.Focus();
    }
    else
    {
        this.DialogResult = DialogResult.OK;
    }
}
//取消按鈕處理程式
private
void buttonCancel_Click(object sender, EventArgs e)
{
    this.DialogResult = DialogResult.Cancel;
}
//窗體關閉處理程式,在關閉窗體時發生。
private void OptionForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (this.DialogResult != DialogResult.Cancel && this.DialogResult != DialogResult.OK)
        e.Cancel = true;
}

上面的程式碼都正常,就是事件寫多了,對上面程式碼進行修改,去掉[取消]按鈕事件和窗體關閉事件以及相關的事件處理程式。首先需要在窗體建構函式中通過設定按鈕的DialogResult屬性來實現返回特定的DialogResult。
this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;
this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;

註冊確定按鈕事件,
//註冊確定按鈕事件
this.buttonOK.Click += new System.EventHandler(this.buttonOK_Click);
//確定按鈕處理程式
private void buttonOK_Click(object sender, EventArgs e)
{
    if (this.textBoxPath.Text.Trim().Length == 0)
    {
        MessageBox.Show("輸入的路徑資訊不對!");
        this.textBoxPath.Focus();
        //設定文字框焦點
        this.DialogResult = DialogResult.None;
    }
}
可見,新的實現方式程式碼減少了一半。 

窗體的引數傳遞
對於窗體間的資料傳遞,是剛開始從事.Net窗體應用程式開發人員碰到的一個常見問題,在此講幾個常見的實現方式。此節內容適用於模式窗體或非模式窗體,部分方式延伸到一般類的操作。

(1)建構函式引數傳遞
通過建構函式傳遞引數應該是比較基本的引數傳遞方式,過載建構函式,通過帶引數的建構函式來例項化窗體。
在窗體類內部定義引數變數,
private object myParams;

實現建構函式,
public OptionForm(object parameters)
{
    InitializeComponent();
    this.myParams = parameters;//設定引數引用
}

例項化窗體,
OptionForm form = new OptionForm( myParams );

在實際使用過程中,需要注意傳入的是引用型別還是值型別,處理方式會有所不同。

(2)使用窗體的屬性
說起屬性關聯,上面已經提到過Form.Owner屬性,下面筆者根據MSDN文件來比較完整的講一下,大部分的文字來自MSDN文件,為保證其完整性,對其中一些屬性描述進行了擴充套件。

Form.Owner 屬性。獲取或設定擁有此窗體的窗體。
語法,public Form Owner { get; set; }
若要使某窗體歸另一個窗體所有,可為其 Owner 屬性分配一個對將成為所有者的窗體的引用。當一個窗體歸另一窗體所有時,它便隨著所有者窗體最小化和關閉。例如,如果 Form2 歸窗體 Form1 所有,則關閉或最小化 Form1 時,Form2 也會關閉或最小化。並且附屬窗體從不顯示在其所有者窗體後面。可以將附屬窗體用於查詢和替換視窗之類的視窗,當選定所有者窗體時,這些視窗不應消失。
Form.OwnedForms 屬性。獲取 Form 物件的陣列,這些物件表示此窗體擁有的所有窗體。
語法,public Form[] OwnedForms { get; }
此屬性返回包含此窗體擁有的所有窗體的陣列。要使某窗體歸另一個窗體所有,可呼叫 AddOwnedForm 方法。分配給所有者窗體的窗體將保持被擁有狀態,直到呼叫了 RemoveOwnedForm 方法。如果窗體是多文件介面 (MDI) 父窗體,則除了當前開啟的所有 MDI 子窗體外,此屬性將返回所有顯示的窗體。
Form.MdiChildren 屬性。獲取窗體的陣列,這些窗體表示以此窗體作為父級的多文件介面 (MDI) 子窗體。
語法,public Form[] MdiChildren { get; }
此屬性使您得以獲取對當前在某 MDI 父窗體中開啟的所有 MDI 子窗體的引用。若要建立 MDI 子窗體,請將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以使用此屬性依次通過所有 MDI 子窗體,以執行一些操作,如當 MDI 父窗體關閉時將資料儲存到資料庫中,或者根據應用程式中執行的操作更新子窗體上的欄位。
Form.MdiParent 屬性。獲取或設定此窗體的當前多文件介面 (MDI) 父窗體。
語法,public Form MdiParent { get; set; }
若要建立 MDI 子窗體,請將要成為 MDI 父窗體的 Form 分配給該子窗體的 MdiParent 屬性。可以從某 MDI 子窗體使用此屬性來獲取所有子窗體都需要的全域性資訊或者呼叫對所有子窗體執行操作的方法。
Form.ActiveForm 靜態屬性。獲取此應用程式的當前活動窗體。
語法,public static Form ActiveForm { get; }
表示當前活動窗體,或者如果沒有活動窗體,則為空引用。可以使用此方法獲得對當前活動窗體的引用,以在該窗體或其控制元件上執行操作。
Form.ActiveMdiChild 屬性。獲取當前活動的多文件介面 (MDI) 子視窗。
語法,public Form ActiveMdiChild { get; }
返回表示當前活動的 MDI 子視窗的 Form,或者如果當前沒有子視窗,則返回 空引用。可使用此方法確定 MDI 應用程式中是否有任何開啟的 MDI 子窗體。也可使用此方法從 MDI 子視窗的 MDI 父窗體或者從應用程式中顯示的其他窗體對該 MDI 子視窗執行操作。
ContainerControl.ParentForm 屬性。獲取將容器控制元件分配給的窗體。
語法,public Form ParentForm { get; }
將容器控制元件分配給的 Form。

以上屬性MSDN提供相應的程式碼事例,可直接拿來除錯使用。

(3)使用公共屬性
使用公共屬性也是一種比較常用的方式,通過窗體設計器新增的控制元件預設訪問修飾符為private級別,可以設定成public或Internal(在程式集內部可見)來對外公開。比如對窗體中的Button進行公開,那就可以訪問Button的相關屬性,同時也可以註冊事件或撤銷事件註冊。如,
OptionForm form = new OptionForm();
form.buttonOK.Click += new EventHandler(buttonOK_Click);
form.ShowDialog();

對於只允許讀取訪問或修改訪問的控制元件或變數可以通過屬性來控制。對(1)方式進行修改,去除過載建構函式,增加屬性也可以實現同樣的效果。
public object MyParams
{
    get { return this.myParams;  }
    set { this.myParams = value;  }
}

(4)使用公共方法
使用公共方法類似於屬性,對上面的同等實現如下,
//獲取引數
public object GetParams()
{
    return this.myParams;
}
//設定引數
public void SetParams(object myParams )
{
    this.myParams = myParams;
}

(5)使用靜態類該方式可以簡單的理解為靜態變數全域性共享,通過下面程式碼能夠比較清楚的理解,先來定義靜態類,
public static class ParameterSettings
{
    //公共靜態變數
    public static string Username = "Zhengzuo";
    //私有靜態變數
    private static string userRole = "Administrators";
    //私有靜態變數
    private static string password = "http://blog.csdn.net/zhzuo";
    //內部屬性
    internal static string UserRole
    {
        get { return userRole; }
    }
    //公共屬性
    public static string Password
    {
        get { return password; }
        private set { password = value; }
    }
}

在需要訪問的地方通過以下方式進行,
string username = ParameterSettings.Username;
string password = ParameterSettings.Password;
string userRole = ParameterSettings.UserRole;
ParameterSettings.Username = "鄭佐";

相關推薦

基於.net平臺windows開發模式窗體

//form.ShowDialog(); form.ShowDialog(this); 對於指定所有者方式開啟的模式窗體可以在模式窗體內部獲取主窗體的引用, //在模式窗體內部訪問所屬窗體 MainForm form = this.Owner as MainForm; 注意,如果以Form.ShowDialo

基於.Net平臺開發模式窗體

適用於:Windows 作業系統 .NET Framework 1.x,2.0執行時環境 .NET Windows開發Visual Studio 2005 概述 何謂模式窗體?簡單的可以理解為窗體對話方塊,使用者必須在完成該窗體上的操作或關閉窗體後才能返回開啟此窗體的窗體。本文不對模式窗體的定義、特徵

基於.NET平臺開發的常識

C#:Csharp,英 [ʃɑːp],是微軟推出的基於.NET Framework平臺的高階程式語言。 .NET: DotNet,英 [dɒ:net],是微軟推出的開發平臺。 Visual Studio:英 ['vɪʒjʊəl; -zj-]['stjuːdɪəʊ],微軟

基於.NET平臺常用的框架整理

open producer oauth isp mps exce too cms table 自從學習.NET以來,優雅的編程風格,極度簡單的可擴展性,足夠強大開發工具,極小的學習曲線,讓我對這個平臺產生了濃厚的興趣,在工作和學習中也積累了一些開源的組件,就目前想到的先整理

Centos7.2下Nginx配置SSL支持https訪問(站點是基於.Net Core2.0開發的WebApi)

ack 保存 受害者 etc proxy cer 查看 綁定 客戶端 準備工作 1.基於nginx部署好的站點(本文站點是基於.Net Core2.0開發的WebApi,有興趣的同學可以跳http://www.cnblogs.com/GreedyL/p/7422796.ht

基於.NET平臺常用的框架整理(轉)

god mat 訂閱 socket 丟失 訪問性 pdf 分布式系 雲計 自從學習.NET以來,優雅的編程風格,極度簡單的可擴展性,足夠強大開發工具,極小的學習曲線,讓我對這個平臺產生了濃厚的興趣,在工作和學習中也積累了一些開源的組件,就目前想到的先整理於此,如果再想到,就

快取資料庫在web開發的重要性

1.開局先丟擲如下問題:   ①當關系型資料庫存放的資料量很大時,每次查詢耗時明顯變長,那麼如何解決該問題?   ②當業務要求單使用者登入(即同一個賬戶有一個使用者登入後,第二個使用者再登入該賬戶要麼擠出之前的登入使用者,要麼無法登入直到前一個登入賬戶登出後才能登入),如何設計?   ③當業務要求及時更

基於.NET平臺常用的框架整理(重要)

自從學習.NET以來,優雅的程式設計風格,極度簡單的可擴充套件性,足夠強大開發工具,極小的學習曲線,讓我對這個平臺產生了濃厚的興趣,在工作和學習中也積累了一些開源的元件,就目前想到的先整理於此,如果再想到,就繼續補充這篇日誌,日積月累,就能形成一個自己的元件經驗庫。 分散式快取框架: Mic

ES6之promise 實際開發的使用(一)

一:promise是個什麼鬼?   1.1:說起promise這個玩意,首先呢,我們來討論一下什麼叫做"非同步"而於此相反的呢就是"同步"呢,好,那下面讓寡人給大家舉個例子來講明白什麼是同步什麼是非同步.                 1.1.1:同步     同步就

在.Net的WinForm開發如何實現控制元件隨窗體大小的改變而自動適應其改變

在設計可供使用者調整大小的窗體時,如何實現該窗體上的控制元件也應能正確地隨窗體的改變而自動調整大小並且能重新定位?此時就要藉助控制元件的.Anchor屬性。Anchor屬性定義控制元件的定位點位置。當控制元件錨定到某個窗體時,如果該窗體的大小被調整,那麼該控制元件維持它與定位

AspNetCore 使用NLog日誌,NLog是基於.NET平臺開的類庫!(又一神器)

using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft

React-Native學習手冊----搭建基於ios平臺開發環境

首先推薦幾個連結: React-Native 官網地址:https://facebook.github.io/react-native/docs/getting-started React-Native實現了跨平臺的移動應用開發,可以說是大大的降低了人工成本,提高了程式碼複用效率。 React-Nati

基於.Net進行前端開發的技術棧發展路線(一)

前言   今天想講講的是我的技術樹。我最初是做CS開發的,第一階段的技術經歷是以Powerbuilder來做CS開發,第二階段開始基於C#做winform開發,眼看前端開發越來越流行,需要更廣泛的技術棧勢在必行。因此以.Net為基礎,我開始拓展自己的技術棧。從14年到18年,跨越了很多界限,到現

autocad.net二次開發visualstudio版本問題

Overview of Microsoft Visual Studio Microsoft Visual Studio概述 Microsoft Visual Studio is an object-oriented programming environment that

.Net平臺開發中文語音應用程式

摘要: 語音是人類最自然的互動方式,也是現階段軟體使用者介面發展的最高目標。微軟公司一直積極推動語音技術的發展,並且公佈了語音開發平臺Speech SDK幫助開發人員實現語音應用。 隨著.net技術深入人心,越來越多的程式設計師開始轉到.net平臺上進行開發。然而,在新發

基於.Net進行前端開發的技術棧發展路線(二)

流行 app開發 技術學習 andriod 產品 發的 sele 點擊 blog 原文:基於.Net進行前端開發的技術棧發展路線(二)前言 上一篇《我的技能樹》文章分享了我的技能成長過程,還未完成,今天繼續跟大家分享。 01 我的技能樹 我的當前的

基於.NET的Excel開發:單元格區域的操作(讀取、賦值、邊框和格式)

XlBordersIndex列舉 xlDiagonalDown:對角線,從左上角到右下角。 xlDiagonalUp:對角線,從左上角到右下角。 xlEdgeBottom:底部邊框。 xlEdgeLeft:左部邊框。 xlEdgeRight:右部邊框。 xlEdgeTop:頂部邊框。 xlInsideH

.NET獲取windows使用者所有屬性

DirectoryEntry de = new DirectoryEntry("LDAP://" + DomainName); de.Username = "liuya

基於.net平臺的web框架搭建

    最近基於ExtJs和asp.net mvc做了一個系統.來總結下.一起討論下. 一.技術分析 1.web資料傳輸 ExtJS作為前端UI展現層,傳輸資料格式為json或者xml,一般大部分為json. 2.asp.net mvc (不要考慮太多mvc其他特性,c

基於335X平臺的UBOOT交換芯片驅動移植

-m 驅動移植 暫時 time 函數 down appears avi 使用 基於335X平臺的UBOOT中交換芯片驅動移植 一、軟硬件平臺資料 1、開發板:創龍AM3359核心板,網口采用RMII形式。 2、UBOOT版本:U-Boot-2016.05,