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、将以上方法反过来用,让从窗体访问创建它的主窗体中的成员,需要增加一个步骤:在从窗体的构造函数中传入一个主窗体的引用,以便找到创建它的主窗体(新建的构造函数中不要忘了调用initializecomponent()函数)。主窗体创建从窗体对象时传入自身的引用。例如:
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、从窗体访问主窗体中的成员,如果主窗体只有一个实例,或者被访问对象是全局性的,可以将主窗体中要求访问的成员设置为静态的,加上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的事件委托机制,实现更加灵活的相互调用。下例是从窗体激发主窗体的事件。事件委托机制的功能事实上远比此例强大,大家可以找书看看它的详细用法。
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、同样的道理,结合方法2和方法4可以实现主窗体激发从窗体的事件,这个请读者自己实验。当然这样一来代码会显得比较乱。一个较好的解决方法是将事件封装入一个接口,同时在事件的发布方和订阅方实现。这种技术在.net remoting远程对象操作技术中尤为重要,有一篇不错的文章给大家参考:《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是一个强大而灵活的体系,只要肯动脑筋,一定能发现不少这样的技巧。