.NET中窗体间相互访问的几种方式

2005/08/07 | 16:25 | 分类:Windows开发 | 标签: | 1,177次阅读

.NET中窗体间相互访问的几种方式

  在我们的程序中,窗体之间经常要相互访问彼此的成员,调用彼此的方法,或者激发彼此的事件。下面就我的经验,简单谈谈在.NET中窗体间相互访问的几种方式。

  以下给出了C#.NET和VB.NET的示例代码。用Form1、Form2类分别表示主、从窗体。

  1、内部成员访问法,适合于主窗体访问它所创建的从窗体对象中的成员。只需将从窗体允许主窗体访问的那些成员加上internal或Friend限定符。例如:

C#主 private void ShowForm2Info() {    Form2 f2 = new Form2();

    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() {    Form2 f2 = new Form2(this);

    f2.Show();

}

 

internal string MyName = "A Form1 Object";

C#从 private Form1 f1;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 Form1Public Sub New(ByVal _f1 As Form1)

    MyBase.New()

    InitializeComponent()

    f1 = _f1

End Sub

 

Private Sub ShowForm1Info()

    MsgBox(f1.MyName)

End Sub

  注:我的朋友wuzhenzhi指出,对主窗体的引用,通过属性或方法传入要比通过在构造函数中传入好,因为“对于一个窗体,没什么,但如果是一个用户控件,我们经常会像拖动Button控件一样从工具栏里拽下来,这时系统就会调用默认的那个构造函数,而不是你的那个重载版本,这办法就失灵了。”这个建议有道理。

  3、从窗体访问主窗体中的成员,如果主窗体只有一个实例,或者被访问对象是全局性的,可以将主窗体中要求访问的成员设置为静态的,加上static或Shared限定符即可:

C#主 private void ShowForm2() {    Form2 f2 = new Form2();

    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() {

    Form2 f2 = new Form2();

    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模拟全局变量的方法。另外我的朋友wuzhenzhi提出了在全局模块中建立全局变量解决方案,大家可以参考他的文章:《对默认启动窗体操作的方法》(http://wuzhenzhi.blogdriver.com/wuzhenzhi/875776.html

  7、本文发布的第二天,wuzhenzhi提醒我:事实上.NET中有一个现成的方法让从窗体访问主窗体的成员,就是带有owner参数的Form.ShowDialog方法。这个owner便是对主窗体的引用。这个快捷的方法适合于对话框性质的从窗体(也就是说在操作从窗体时不允许操作主窗体),但对诸如MDI子窗体等不适用。注意owner是个IWin32Window,需要强制转化为主窗体类。

C#主 private void ShowForm2() {    Form2 f2 = new Form2();

    f2.ShowDialog(this);

}

 

internal string MyName = "A Form1 Object";

C#从 private void ShowForm1Info() {    MessageBox.Show(((Form1)(this.Owner)).MyName);

}

VB主 Private Sub ShowForm2()    Dim f2 As New Form2()

    f2.ShowDialog(Me)

End Sub

 

Friend MyName As String = "A Form1 Object"

VB从 Private Sub ShowForm1Info()    MsgBox(CType(Me.Owner, Form1).MyName)

End Sub

  8、那么对于MDI子窗体有什么好方法呢?最怕的就是看了上面的几种方法,形成思维定势,直接就套用了。须知矛盾有普遍性,也有特殊性,对于MDI子窗体照样有现成的方法,就是调用子窗体的MdiParent属性访问主窗体。这个想必大家都知道,放在这里,保持文章的完整性。

C#主 private void ShowForm2() {    Form2 f2 = new Form2();

    f2.MdiParent = this;

    f2.Show();

}

 

internal string MyName = "A Form1 Object";

C#从 private void ShowForm1Info() {    MessageBox.Show(((Form1)(this.ParentForm)).MyName);

}

VB主 Private Sub ShowForm2()

    Dim f2 As New Form2

    f2.MdiParent = Me

    f2.Show()

End Sub

 

Friend MyName As String = "A Form1 Object"

VB从 Private Sub ShowForm1Info()    MsgBox(CType(Me.ParentForm, Form1).MyName)

End Sub

  OK,就说到这里。.NET是一个强大而灵活的体系,只要肯动脑筋,一定能发现不少这样的技巧。

大一这一年的编程学习总结

2005/07/24 | 21:09 | 分类:学习随感 | 标签: | 673次阅读

  我在上大学之前,有一定的计算机学习基础。在编程方面,小学时自学过QBasic,中学时自学并简单地应用过VB6。我还做过网站,熟悉HTML,了解一点javascript。一定的编程思想基础是快速学好一门新的程序设计技术的必要条件。

  说到编程的基础,人们往往首先想到C语言。的确,C语言是一门基础而重要的课程,深入地学习好C语言是培养编程思想的重要途径。而就我个人来讲,我在大一这一年编程方面的学习顺序有点与众不同:在我们入学后,我的班主任金旭亮老师提出了他的一套“打破常规”的教学理念,引起了我班不少同学的兴趣。我们在金老师的指导下开始学习.NET。我有一定的基础,因此对程序语言(C#.NET、VB.NET)的理解很快。但我那时缺乏对面向对象设计方法和程序在计算机中运行机理的认识。我当时对面向对象(Object-Oriented)的理解就是“Control-Faced”,这大概是原先学习 VB6留下的印象。由于不清楚程序在计算机中运行的机理,我写的不少程序大量浪费内存,算法也比较笨拙。大一第二学期,学校开始上C语言课。对学校的教材、教法、考试方法,不满意的恐怕不只我一人:C语言之精华在学校的教育中被淡化,学生被引入一个个的牛角尖,良好的编程理念和习惯培养无从谈起。我主要靠自学,读了一些国外教材(《K&R C》、《深入理解计算机系统》),同时也简单地看了看C++(《Thinking in C++》)。通过这些基础学习,我澄清了很多原先学习VB6、.NET等方面的问题,对编程思想的认识有了进一步提高。总之,我在有的方面走了捷径,有的方面也走了一些弯路。但事实上,每个人都有适合自己的学习方法,我认为我们一方面要把握自己的实际(兴趣、基础等),另一方面一定要多听听别人,特别是本专业老师、学长的建议,少走弯路,高效地向真正对自己有益的技术方向迈进。

  再说说我对.NET的看法。.NET似乎是一个争议很大的事物。逛逛论坛,发现其狂热支持者和坚决抵制者真是针锋相对。就拿我们北京理工大学来说,金老师可谓.NET阵营的代表,他在学校大力推广.NET,开选修课、带兴趣小组、做项目,热火朝天。而soff老师(著名的珊瑚虫QQ作者)则对. NET不屑一顾,坚持自己的研发道路。他们的观点也各有其道理,在校内论坛上引起热烈的讨论。通过一年的学习以及与老师、同学的交流,我不敢下什么结论,但从自己的实际出发,我的看法是:学习计算机原理、编程思想基础,C、C++这条老路还是不错的,而要以.NET作为出发点似乎不太合适。.NET的确好上手,但如果缺少正确的导引,往往会给初学者在概念上、理论上以错误或不足的认识。要深入理解计算机系统,.NET这样高度托管化的体系更是不容易做到。但.NET的优势在于它高度的开发效率和它丰富的Framework类库。在实际工作中用.NET开发,为我们节约了大量的时间和精力。同时,作为一个新生的事物,.NET本身也在不断地自我完善中,相信Microsoft会在给它一个明确的定位的基础上,平衡技术与应用之间的关系。

  总结大一这一年我在编程方面的学习,有以下几点经验:通过多种途径(老师、同学、书籍、网络……)虚心学习,团队合作共同提高;理论与实践相结合,加速加强认知;认识到个人精力有限,不要想把什么都学会;选择学习一种编程技术,应当求其精髓,不要什么都碰,浅尝辄止;找到自己的兴趣与擅长,发现自己的潜能所在,学习适合自己的知识,不盲目跟风,不迷他人;注重知识的积累和联系。最后,最重要的是该干啥干啥,能干啥干啥,大学时间宝贵,切忌虚度光阴!

页面存档: 上页 1 2 3 下页