Windows 窗體是用於 Microsoft Windows 應用程序開發的
基於
NET Framework 的新平台
此框架提供一個有條理的
面向對象的
可擴展的類集
它使您得以開發豐富的 Windows 應用程序
一個Windows窗體就代表了
NET架構裡的System
Windows
Forms
Form類的一個實例
作者在CSDN技術論壇
NET板塊下的C#分類經常看到有人問起如何在兩個Form間傳遞數據
訪問修改對方窗體裡面的值
對於有經驗的程序員來說不是什麼高深的東西
而對於初學者來說這些基礎的東西往往是一個問題
並且存在這種現象
往往比較復雜的東西他們會
要用什麼了就去學什麼
實際上並沒有真正的去理解掌握它
基礎不扎實
所以就有了想通過自己對窗體編程積累的經驗來寫一些這方面的文章
以供學
NET的朋友參考
也借此機會同各位朋友進行交流
寫得不合理的地方請各位朋友提寶貴意見
下面我分了三個部分來講
一.使用帶參數的構造函數
我們要做的准備工作就是新建兩個窗體
下面是兩個窗體的布局
很簡單

說明
Form
為主窗體
包含控件
文本框textBoxFrm
多選框checkBoxFrm
和按鈕buttonEdit
Form
為子窗體
包含控件
文本框textBoxFrm
多選框checkBoxFrm
和按鈕buttonOK
buttonCancel
當我們新建一個窗體的時候
設計器會生成默認的構造函數
public Form
()
{
InitializeComponent();
}
它不帶參數
既然我們要把Form
中的一些數據傳到Form
中去
為什麼不在Form
的構造函數裡做文章呢?
假設我們要實現使Form
中的文本框顯示Form
裡textBoxFrm
的值
修改子窗體的構造函數
public Form
(string text)
{
InitializeComponent();
this
textBoxFrm
Text = text;
}
增加Form
中的修改按鈕點擊事件
處理函數如下
private void buttonEdit_Click(object sender
System
EventArgs e)
{
Form
formChild = new Form
(this
textBoxFrm
Text);
formChild
Show();
}
我們把this
textBoxFrm
Text作為參數傳到子窗體構造函數
以非模式方式打開
這樣打開的formChild的文本框就顯示了
主窗體
文本
是不是很簡單
接下來我們傳一個boolean數據給子窗體
Public Form
(string text
bool checkedValue)
{
InitializeComponent();
this
textBoxFrm
Text = text;
this
checkBoxFrm
Checked = checkedValue;
}
在主窗體中的修改按鈕點擊處理
我采用了打開模式窗口的方式
其實在這個例子中看不出有什麼分別
private void buttonEdit_Click(object sender
System
EventArgs e)
{
Form
formChild = new Form
(this
textBoxFrm
Text
this
checkBoxFrm
Checked);
formChild
ShowDialog();
}
結果在預料之中
但是這裡明顯存在不足
在子窗體裡的數據修改後不能傳給主窗體
也就是說主窗體不受子窗體的影響
而在實際的開發過程中我們經常使用子窗體來修改主窗體裡面的數據
那怎麼解決呢?
在
NET中有兩種類型
值類型和引用類型
值類型是從ValueType繼承而來
而ValueType又是從Object繼承
對於引用類型它直接繼承Object類型
這下讓我們看看怎樣通過Form
來修改Form
裡的數據
還是讓我們來修改Form
的代碼
Private TextBox textBoxFrm
;
private CheckBox checkBoxFrm
;
public Form
(TextBox heckbo
CheckBox heckbox)
{
InitializeComponent();
this
textBoxFrm
Text = heckbo
Text;
this
checkBoxFrm
Checked = heckbox
Checked;
this
textBoxFrm
= heckbo;
this
checkBoxFrm
= heckbox;
}
現在我們傳了兩個引用類型的數據
TextBox類型
和CheckBox
另外在Form
中增加了兩個類數據成員textBoxFrm
checkBoxFrm
用來分別保存構造函數傳來的變量
不過他們並不屬於Form
的Controls容器
修改Form
的確定按鈕點擊事件函數
private void buttonOK_Click(object sender
System
EventArgs e)
{
this
textBoxFrm
Text = this
textBoxFrm
Text;
this
checkBoxFrm
Checked = this
checkBoxFrm
Checked;
this
Close();
}
上面的代碼我們通過把textBoxFrm
的Text和checkBoxFrm
Checked賦給textBoxFrm
和checkBoxFrm
完成了對主窗體中的textBoxFrm
和checkBoxFrm
的修改
因為textBoxFrm
和textBoxFrm
是同一個引用
而checkBoxFrm
和checkBoxFrm
也是
到這裡為止功能是實現了
但是總覺得不是很合理
讓兩個窗體控件傳來傳去
現在我舉一個恰當一點的例子
修改了兩個窗體

說明
在這個例子中我們的兩個窗體都加了一個ListBox用來顯示ArrayList中的內容
主窗體中控件
listBoxFrm
buttonEdit
子窗體中控件
listBoxFrm
textBoxAdd
buttonAdd
buttonEdit
buttonOK
這次我們用ArrayList來作為傳遞數據
在Form
中定義類數據成員
private ArrayList listData
;
在構造函數中增加了對listData
進行內存分配
並生成數據最終綁定到listBoxFrm
public Form
()
{
InitializeComponent();
this
listData
= new ArrayList();
this
listData
Add(
DotNet
);
this
listData
Add(
C#
);
this
listData
Add(
);
this
listData
Add(
WebService
);
this
listData
Add(
XML
);
this
listBoxFrm
DataSource = this
listData
;
}
另外
對修改按鈕點擊事件處理函數的修改如下
private void buttonEdit_Click(object sender
System
EventArgs e)
{
Form
formChild = new Form
(this
listData
);
formChild
ShowDialog();
this
listBoxFrm
DataSource = null;
this
listBoxFrm
DataSource = this
listData
;
}
相對與主窗體
對子窗體作相應修改
也在Form
中增加了類數據成員
private ArrayList listData
;
用來保存對主窗體中listData
的引用
修改構造函數
public Form
(ArrayList listData)
{
InitializeComponent();
this
listData
= listData;
foreach(object o in this
listData
)
{
this
listBoxFrm
Items
Add(o);
}
}
這裡讓listData
同listData
指向同一個引用
另外沒有對listBoxFrm進行綁定
采用了填充
好了
下面是對數據操作的時候了
添加處理函數代碼如下
private void buttonAdd_Click(object sender
System
EventArgs e)
{
if(this
textBoxAdd
Text
Trim()
Length>
)
{
this
listData
Add(this
textBoxAdd
Text
Trim());
this
listBoxFrm
Items
Add(this
textBoxAdd
Text
Trim());
}
else
MessageBox
Show(
請輸入添加的內容!
);
}
刪除處理代碼如下
private void buttonDel_Click(object sender
System
EventArgs e)
{
int index = this
listBoxFrm
SelectedIndex;
if(index!=
)
{
this
listData
RemoveAt(index);
this
listBoxFrm
Items
RemoveAt(index);
}
else
MessageBox
Show(
請選擇刪除項或者沒有可刪除的項!
);
}
退出Form
子窗體
private void buttonOK_Click(object sender
System
EventArgs e)
{
this
Close();
}
編譯運行程序
在子窗體中對數據進行修改
關閉後
主窗體就會顯示更新後的數據
這裡有一點要提醒一下
比較兩個例子
我們都傳的是引用類型
一個是String
另一個是ArrayList
為什麼string類型不能修改主窗體的數據呢?其實在
Net中對string類型的修改並不是修改原來的值
原來的值沒有變化
而是重新生成一個新的字符串
下面是一個很好的說明
public class ZZConsole
{
[STAThread]
static void Main(string[] args)
{
string str
=
abc
;
string str
= str
;
str
=
;
Console
WriteLine(str
);
Console
WriteLine(
);
Console
WriteLine(str
);
Console
WriteLine(
);
ArrayList al
= new ArrayList();
al
Add(
abc
);
ArrayList al
= al
;
al
Add(
);
foreach(object o in al
)
Console
WriteLine((string)o);
Console
WriteLine(
);
foreach(object o in al
)
Console
WriteLine((string)o);
Console
ReadLine();
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26426.html