摘 要:程序設計中經常需要把參數從一個函數傳遞到另一個函數,或者獲取某個函數的返回值。基于Winform的程序經常需要把參數從一個窗體傳入到另一個窗體,或者某一窗體中內容變更時另一窗體相同內容隨之改變,利用C#提供的類、對象屬性、委托幾種機制,提出通過使用構造函數對對象進行初始化、變更對象屬性、借助委托等方法實現多個窗體間的參數傳遞和內容的同步更新顯示。在對各種方法應用對比的同時,重點發掘了委托機制為實現窗體間內容的傳遞和同步更新所帶來的優勢。
關鍵詞: 參數傳遞; 同步顯示; Winform程序; C Sharp
中圖分類號:TN98; TP311 文獻標識碼:A 文章編號:1004-373X(2010)14-0064-03
Realization of C#-based Winform Program Parameter Transmission and Synchronous Display
LIU Hui, CHANG Wan-lun
(Higher Institute of Technolog, Xi’an University of Technology, Xi’an 710082, China)
Abstract: The parameter transmission between forms and the synchronous update display realized with methods of the object initialization, variation of object properties and authorization implemented by constructing functions is put forward by the mechanisms of C#-provided classes, object properties and authorization. By comparisonwith various methods, the authorization mechanism is explored emphatically to realize the parameter transmission between forms and synchronous update.
Keywords: parameter transmission; synchronous display; Winform program; C Sharp
目前,微軟的.NET平臺已經成為主流的開發平臺,幾乎與Sun公司的Java語言并駕齊驅,而C#是.NET平臺的主流語言,且日益受到了程序員的喜愛。
在程序設計中,常需要把參數從一個函數傳遞到另一個函數中,這就是通常所說的函數調用過程中的參數傳遞,即用實參的值傳遞給形參的方式來傳遞信息。C#程序設計也不例外,同樣存在著值傳遞和引用傳遞兩種方法[1-3]。同時,在進行Winform程序設計時,當多個窗體間發生參數傳遞時,一個窗體中的值發生變更,其他窗體顯示的內容也應該同步更新。
1 Winform程序的值傳遞
值傳遞(call by value)中,函數將參數復制到子程序的參數中,改變子程序的參數不會影響用于調用的參數。如圖1所示。在C#的TestWindowsApplication 項目中存在著兩個窗體,現在需要在按“確定”按鈕后彈出窗體Form2,并把窗體Form1中TextBox控件tB中的內容單向傳遞到窗體Form2中的Label控件lB中,并顯示出來。這種C#中的Winform程序窗體間用于值傳遞的實現機制有以下幾種方法:
圖1 TestWindowsApplication項目的
兩個窗體Form1和Form2
1.1 借助于對象的構造函數接收參數
如下程序段中,在Form2中使用一個private變量,同時設置一個public的有參構造函數,通過該函數修改其中的私有變量termname。同時,在Form1中實例化對象時調用該有參構造函數,實現參數tB.Text的單向傳遞。
利用對象的構造函數接收參數程序示例:
namespace TestWindowsApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bt Click(object sender,EventArgs e)
{
Form2 frm = new Form2(tB.Text);
frm.ShowDialog();
}
}
}
namespace TestWindowsApplication
{
public partial class Form2 : Form
{
private string termname;
public Form2(string xx)
{
InitializeComponent();
termname = xx;
}
private void Form2 Load(object sender,EventArgs e)
{
lB.Text = termname;
}
}
}
1.2 使用屬性機制完成參數傳遞
如下所示程序段,在Form2中使用一個private變量,同時對該變量構造一個屬性,在屬性中對該私有變量進行讀/寫,因其屬性為public類型,則在Form1中可以直接通過TermName屬性完成對私有變量的設置。
利用屬性機制完成參數傳遞程序示例:
namespace TestWindowsApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bt Click(object sender,EventArgs e)
{
Form2 frm = new Form2();
frm.TermName = tB.Text;
frm.ShowDialog();
}
}
}
namespace TestWindowsApplication
{
public partial class Form2 : Form
{
private string termname;
public int TermName
{
get { return termname; }
set { termname = value; }
}
public Form2()
{
InitializeComponent();
}
private void Form2 Load(object sender,EventArgs e)
{
lB.Text = TermName;
}
}
}
1.3 直接設置控件的Modifers屬性
把Form2中label控件的Modifers屬性設置為public,則剩下的工作就是在Form1中填寫下列代碼即可:
Form2 frm = new Form2();
frm.lB.Text = x.ToString() ;
frm.ShowDialog();
2 Winform程序的引用傳遞
引用傳遞(call by reference)中,函數復制到子程序中的是參數的地址,用此方法獲取指向調用方數據的指針,此數據與調用方共享,如果方法對引用參數進行更改,則這些更改即是對調用方的數據進行的。這就是我們常說的參數的雙向傳遞[4-7]。在C#中,進行引用傳遞時需要在參數前加上關鍵字ref或out,如下程序段所示。但這種情況不適合Winform程序的事件編程。
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}
3 借助委托實現參數回傳后的同步顯示
如圖2所示,當在C#的TestWindowsApplication 項目的Form1中按下“增加新學期”按鈕后彈出窗體Form3,此時在Form3中可以改變年份和學期名,當按下“確定”按鈕后,要求Form1中的當前學期內容隨之改變(如圖3所示)。這時不僅要求把Form3中增加的新學期當作當前學期回傳到Form1中,同時還要求能夠馬上刷新Form1窗體,此時需要在Form1中使用C#提供的委托機制[8]實現參數回傳。
圖2 TestWindowsApplication項目的
兩個窗體Form1和Form3
委托機制的實現方法:
(1) 在充當子界面的Form3窗體中,首先定義委托和委托對象:
public delegate void ChangeTerm(); //定義一個委托
public ChangeTerm changeterm; //定義一個委托對象
然后,在適當的事件中執行委托操作即可。如可在“確定”按鈕的單擊事件下執行委托。
private void bt Click(object sender,EventArgs e)
{
this.changeterm();
}
圖3 TestWindowsApplication項目中按下窗體Form3
中的確定按鈕后窗體Form1的變化狀況
(2) 在充當主界面的Form1窗體中,首先需要定義一個方法,在該方法中獲取到Form3中選定的當前學期內容,然后在對應的TextBox控件tB中顯示。采用如下所示定義方法ShowTerm:
private void ShowTerm()
{
… //調用委托時所需要執行的語句
}
然后在按下“增加新學期”按鈕時,添加如下代碼即可。
Form3 frm=new Form3();
Frm.changeterm = new Form3.ChangeTerm(ShowTerm);
4 結 語
利用C#提供的幾種機制組合使用,可完美地實現在C#的Winform程序中根據需要把一個值從一個窗口傳入另一個窗口,并且在多個窗口中實現內容的同步更新。
參考文獻
[1]周峰.Visual C#.NET 2005中文版基礎與實踐教程[ M] .北京:電子工業出版社,2007.
[2]HOFFMAN K,KRUGER L.C#.NET技術內幕[M].董梁,高猛,譯.北京:清華大學出版社,2006.
[3]ANDERS Hejlsberg,SCOTT Wiltamuth,PETER Golde.C#編程語言詳解[M].韓江,王秀慧,譯.北京:電子工業出版社,2007.
[4]葉煜.C#語言中參數傳遞分析研究[J].科技創新導報,2008(28):14.
[5]戴志鋒,管建和.C#中屬性定義Value參數的值傳遞機制分析[J].電腦編程技巧與維護,2007(9):22-25.
[6]白雪冰.分析C#程序設計語言中參數的傳遞[J].電腦知識與技術,2007(15):749-750.
[7]劉志華.深入探討C++語言中參數傳遞問題[J].哈爾濱師范大學:自然科學學報,2007,23(4):63-65.
[8]張立.C# 2.0完全自學手冊[M].北京:機械工業出版社,2007.