C# Winform窗口之間傳值的多種方法淺析
摘要
一般的工程都是多個(gè)form組成的,各個(gè)窗體之間經(jīng)常要靈活的傳遞數(shù)據(jù)。下面分享一點(diǎn)自己的經(jīng)驗(yàn):
窗體傳值的方法有很多,下面僅介紹我用過(guò)的一些,不知道官方叫這些什么方法,大家也可以找找看其他的。
通過(guò)構(gòu)造器傳值
這是最簡(jiǎn)單的一種方式,例如我從form1中要傳一個(gè)字符串去form2
首先,在form2的構(gòu)造器中稍作修改:
public Form2(String s)
{
InitializeComponent();
this.labelRecieve.Text = s;
}
添加了一個(gè)string參數(shù) s
然后,在form1的click事件中,將要傳遞的參數(shù)傳入,如下片斷:
private void buttonShow_Click(object sender, EventArgs e)
{
…
Form2 f2;
if (textBoxSend.Text == "")
{
f2 = new Form2("I'm from form1");
}
else
{
f2 = new Form2(textBoxSend.Text);
}
DialogResult r = f2.ShowDialog();//至于Show與ShowDialog就不用再說(shuō)了吧
…
}
在觸發(fā)click事件的時(shí)候,form2就接受到f1傳過(guò)去的textBoxSend.Text或者"I'm from form1",并且用labelRecieve去承接它。
這種方法,雖然簡(jiǎn)單方便,但是畢竟功能有限,當(dāng)需要傳遞較大量的多樣的數(shù)據(jù)時(shí),用構(gòu)造器就不能勝任了。
通過(guò)屬性傳遞
屬性可以方便的傳遞多個(gè)數(shù)據(jù)(不就是添加多個(gè)屬性么?),假設(shè)我要從form2傳遞某字符串到form3,首先我們?yōu)閒orm3添加一個(gè)屬性叫myString
public Form3()
{
InitializeComponent();
}
public string myString
{
get
{
return this.textBoxf3.Text;
}
set
{
if (value == null)
textBoxf3.Text = string.Empty;
else
textBoxf3.Text = value;
}
}
通過(guò)該屬性去設(shè)置文本框的text.
然后,在form2的點(diǎn)擊事件中,只需令
f3.myString = "I'm from form2";
這樣也很方便,值得一提的是,這樣通過(guò)屬性傳遞的時(shí)候,即可以將數(shù)據(jù)從form2船到form3又可以從form3傳回來(lái)。如
if (r == DialogResult.OK)
{
f3.myString = "I'm from form3";
this.labelRecieve.Text = f3.myString;
//form3關(guān)閉的時(shí)候?qū)yString保存到form2的label中。
}
屬性傳遞是最常用的一種方式。
通過(guò)事件攜帶參數(shù)傳遞
坦白說(shuō),我目前還很少用到這,準(zhǔn)確的說(shuō)這個(gè)應(yīng)該叫事件結(jié)合屬性傳值。
現(xiàn)在我在form4里面坐了某些操作,假設(shè)form4是我們開(kāi)發(fā)的類(lèi)型庫(kù)的一部分,我想將它發(fā)布給其他的同事使用的時(shí)候,我們可以使用這樣的事件去傳值。
首先,在form4中,添加事件參數(shù)類(lèi)型和事件處理器委托的定義:
public class myEventArgs : EventArgs
{
string myString;
public string MyString
{
get
{
return myString;
}
set
{
if (value != null)
myString = value;
else
myString = string.Empty;
}
}
public myEventArgs(string s)
{
this.MyString = s;
}
}
//事件處理方法的委托
public delegate void myEventHandler(object sender, myEventArgs e);
然后,我們?cè)赾lick事件中去觸發(fā)這樣一個(gè)公共的事件myClick
public event myEventHandler myClick;
private void buttonClick_Click(object sender, EventArgs e)
{
if (this.myClick != null)
this.myClick(this,new myEventArgs(textBox4.Text));
this.DialogResult = DialogResult.OK;
}
我們將textBox4中的文本封裝到myEventArgs這樣一個(gè)事件參數(shù)對(duì)象里面,這樣它就會(huì)隨著事件被傳到form3中,同時(shí)在form3中我們來(lái)添加一個(gè)事件處理方法,
void f4_myClick(object sender, Form4.myEventArgs e)
{
myString = e.MyString;
this.textBoxf3.Text = String.Format("From f4: {0}",e.MyString);
}
在點(diǎn)擊事件中我們通過(guò)委托去調(diào)用該方法
Form4 f4 = new Form4();
f4.myClick += new Form4.myEventHandler(f4_myClick);
在f4對(duì)象的myClick事件被觸發(fā)以后,會(huì)調(diào)用這里的f4_myClick方法,我們就可以通過(guò)該方法從事件參數(shù)中取得數(shù)據(jù)了,這里是放到textBoxf3中。
就寫(xiě)到這里吧,文中描述的都是最基本的轉(zhuǎn)遞,當(dāng)然傳的參數(shù)可以是各種各樣的,也可以利用泛型委托,也可以把一個(gè)FORM里面的Constrol"傳"到另外的Form里面,大家自己去發(fā)揮吧 :)
相關(guān)文章
C#實(shí)現(xiàn)的文件操作封裝類(lèi)完整實(shí)例【刪除,移動(dòng),復(fù)制,重命名】
這篇文章主要介紹了C#實(shí)現(xiàn)的文件操作封裝類(lèi),結(jié)合完整實(shí)例形式分析了C#封裝文件的刪除,移動(dòng),復(fù)制,重命名等操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-03-03
C#中把字符串String轉(zhuǎn)換為整型Int的小例子
這篇文章主要介紹了C#中把字符串String轉(zhuǎn)換為整型Int的小例子,本文使用TryParse方法實(shí)現(xiàn)轉(zhuǎn)換,需要的朋友可以參考下2014-08-08
C#下實(shí)現(xiàn)創(chuàng)建和刪除目錄的實(shí)例代碼
這篇文章主要介紹了C#下實(shí)現(xiàn)創(chuàng)建和刪除目錄的方法,功能非常實(shí)用,需要的朋友可以參考下2014-08-08
C# 靜態(tài)變量與靜態(tài)方法實(shí)例研究
寫(xiě)了一個(gè)翻譯英漢單詞辭典的小程序,發(fā)現(xiàn)在調(diào)用幾千次的時(shí)候速度很慢2011-11-11
C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)
C#學(xué)習(xí)基礎(chǔ)概念二十五問(wèn)...2007-04-04
C#將html table 導(dǎo)出成excel實(shí)例
C#將html table 導(dǎo)出成excel實(shí)例,需要的朋友可以參考一下2013-04-04
C#?從字符串中分離文件路徑、文件名及擴(kuò)展名的操作
在C#中,處理文件時(shí)經(jīng)常需要分離文件路徑、文件名和擴(kuò)展名,通過(guò)使用Microsoft.Win32命名空間和字符串處理方法如Substring、IndexOf()和LastIndexOf(),可以有效地獲取和操作這些信息,本文介紹C#?字符串中分離文件路徑,感興趣的朋友一起看看2024-09-09

