以下給出了c#.net和vb.net的示例代碼。用form1、form2類分別表示主、從窗體。
1、內(nèi)部成員訪問法,適合于主窗體訪問它所創(chuàng)建的從窗體對象中的成員。只需將從窗體允許主窗體訪問的那些成員加上internal或friend限定符。例如:
c#主
private void showform2info() {
    form
f2.show();
messagebox.show(f2.myname);
}
c#從
internal string myname = "a form2 object";
vb主
private sub showform2info()
dim f2 as new form2
f2.show()
msgbox(f2.myname)
end sub
vb從
friend myname as string = "a form2 object"
2、將以上方法反過來用,讓從窗體訪問創(chuàng)建它的主窗體中的成員,需要增加一個步驟:在從窗體的構(gòu)造函數(shù)中傳入一個主窗體的引用,以便找到創(chuàng)建它的主窗體(新建的構(gòu)造函數(shù)中不要忘了調(diào)用initializecomponent()函數(shù))。主窗體創(chuàng)建從窗體對象時傳入自身的引用。例如:
c#主
private void showform2() {
    form
f2.show();
}
internal string myname = "a form1 object";
c#從
private form
public form2(form1 _f1) {
initializecomponent();
f1 = _f1;
}
private void showform1info() {
messagebox.show(f1.myname);
}
vb主
private sub showform2()
dim f2 as new form2(me)
f2.show()
end sub
friend myname as string = "a form1 object"
vb從
private f1 as form1
public sub new(byval _f1 as form1)
mybase.new()
initializecomponent()
f1 = _f1
end sub
private sub showform1info()
msgbox(f1.myname)
end sub
3、從窗體訪問主窗體中的成員,如果主窗體只有一個實例,或者被訪問對象是全局性的,可以將主窗體中要求訪問的成員設(shè)置為靜態(tài)的,加上static或shared限定符即可:
c#主
private void showform2() {
    form
f2.show();
}
internal static string myname = "a form1 object";
c#從
private void showform1info() {
messagebox.show(form1.myname);
}
vb主
private sub showform2()
dim f2 as new form2()
f2.show()
end sub
friend shared myname as string = "a form1 object"
vb從
private sub showform1info()
msgbox(form1.myname)
end sub
4、還可以運用.net的事件委托機制,實現(xiàn)更加靈活的相互調(diào)用。下例是從窗體激發(fā)主窗體的事件。事件委托機制的功能事實上遠比此例強大,大家可以找書看看它的詳細用法。
c#主
private void showform2() {
    form
f2.show();
f2.sendmessage += new form2.delegateofsendmessage(showmessage);
}
private void showmessage(string str) {
messagebox.show(str);
}
c#從
public delegate void delegateofsendmessage(string str);
public event delegateofsendmessage sendmessage;
private void send() {
sendmessage("a message from form2");
}
vb主
private sub showform2()
dim f2 as new form2
f2.show()
addhandler f2.sendmessage, addressof showmessage
end sub
private sub showmessage(byval str as string)
msgbox(str)
end sub
vb從
public delegate sub delegateofsendmessage(byval str as string)
public event sendmessage as delegateofsendmessage
private sub send()
raiseevent sendmessage("a message from form2")
end sub
5、同樣的道理,結(jié)合方法2和方法4可以實現(xiàn)主窗體激發(fā)從窗體的事件,這個請讀者自己實驗。當然這樣一來代碼會顯得比較亂。一個較好的解決方法是將事件封裝入一個接口,同時在事件的發(fā)布方和訂閱方實現(xiàn)。這種技術(shù)在.net remoting遠程對象操作技術(shù)中尤為重要,有一篇不錯的文章給大家參考:《remoting事件處理全接觸》(http://www.cnblogs.com/wayfarer/articles/75213.html)
6、習慣了vb6中全局變量的朋友可能覺得.net中不支持全局變量對于窗體間的交互很不方便,那么再請大家參考這篇文章:《.net窗體之間的交互》(http://blog.csdn.net/warsgrobe/archive/2005/07/29/438013.aspx),里面敘述了用vb.net模擬全局變量的方法。
ok,就說到這里。.net是一個強大而靈活的體系,只要肯動腦筋,一定能發(fā)現(xiàn)不少這樣的技巧。
新聞熱點
疑難解答
圖片精選