private sub button1_click(byval sender as system.object, _
byval e as system.eventargs) handles button1.click
myform2 = new form2()
myform2.show()
end sub
private sub button2_click(byval sender as system.object, _
byval e as system.eventargs) handles button2.click
calculations.compoundinterestcalc(myform2)
end sub
end class
无论是把窗体指针全局化,还是把它以参数的形式传递,都是可行的。然而,你必须根据项目的需要选择最佳方案。当 .net 项目中只有少数几个过程需要访问特定窗体时,我建议你给这些过程增加一个参数,以在必要时接受窗体指针。当你的项目有太多过程需要访问该窗体时,你就应该考虑设置一个全局窗体指针变量。当然了,你最好还是考虑调整项目代码结构,使得真正访问该窗体的类或者过程只有一个。如果你希望用窗体来显示登录信息,则你可以先创建一个类,把窗体实例保存为它的 shared 类成员,然后添加一个 shared 方法 writetologwindow 来完成实际的窗体访问。于是,项目中的任何代码只需调用此 writetologwindow 方法就能间接访问显示登录信息的窗体了:
public class log
private shared m_logform as form2
public shared property logform() as form2
get
return m_logform
end get
set(byval value as form2)
m_logform = value
end set
end property
public shared sub writetologwindow(byval message as string)
dim sb as new _
stringbuilder(m_logform.txtloginfo.text)
sb.append(environment.newline)
sb.append(message)
m_logform.txtloginfo.text = sb.tostring()
end sub
end class
读取和改变窗体内的信息
到现在为止,我们讨论的只是如何创建和访问窗体实例,而没有涉及如何读取或改变窗体内的信息。如果你的窗体已经按照前述方法实例化,并且访问窗体的代码都位于窗体所在的项目中,则你可以直接操作窗体中的任何控件来读取和改变窗体内的信息。但我觉得这样并不理想。与其直接访问窗体中的文本框、按钮等控件,还不如增加一个 public 属性,通过它来控制窗体中的控件。如果你有意尝试这种特殊的窗体访问方式,请跟我来:
在 visual basic .net 中新建一个 windows 应用程序项目。
此时项目中已经自动生成了一个窗体 form1 。现在添加另一个窗体 form2 :在“解决方案资源管理器”中按右键单击项目名称 -> “添加” -> “添加 windows 窗体” -> 点击“打开”以接受默认名称 form2.vb 。
在 form1 中添加两个按钮,分别按照默认值命名为 button1 和 button2 ,并且调整它们在窗体中的位置以免重叠。
在 form2 中添加一个简单文本框,按照默认值命名为 textbox1
把下列代码添加到 form2 的“end class”前面 (在“解决方案资源管理器”中按右键单击 “form2”-> “查看代码”,再粘贴下列代码):
public property customername() as string
get
return textbox1.text
end get
set(byval value as string)
textbox1.text = value
end set
end property
接下来要做的是:
a. 切换到 form1 的代码,在 “inherits system.windows.forms.form” 后面增加一行:
dim myform2 as new form2()
b. 在 form1 中双击button1 按钮,在它的 click 事件处理程序代码中输入下列代码:
myform2.customername = "fred"
myform2.show()
c. 在 form1 中双击button2 按钮,在它的 click 事件处理程序代码中输入下列代码:
messagebox.show(myform2.customername)
myform2.customername = "joe"
d. 按 f5 运行项目,并点击窗体中的 button1 和 button2 按钮,以观察代码运行情况。
表面看来,通过 customername 属性来访问 form2 与直接访问 form2 非常相似。然而,这种间接的窗体访问方式能够带来很多好处,其中最重要的一点就在于它实现了更高的抽象性。换言之,哪怕你不知道 form2 中控件的任何细节 (比如:窗体中是否包含 textbox 控件) ,也能与 form2 交换数据;你所要做的只是读取或设置 customername 属性值而已。有了这种抽象,你就能在修改 form2 的实现时不影响项目中的其它代码,因而大大简化了整个项目代码的维护。单从本文的例子来看,这种基于属性的窗体编程模式似乎并不比常规方式简单。然而,它以属性的形式隐藏了窗体的全部细节,故能用简洁、一致的代码来访问窗体。所以,它在一些相当复杂的用户界面编程中能够大显身手。总而言之,通过属性值来访问窗体及其控件的编程模式虽然不太直观,却对程序员很有价值:它不但比直接访问窗体的编程模式来得更专业,而且让整个项目的代码清晰易读。
在项目中我采用的是全局变量的方法,代码如下:
public class myform
private shared m_mainform as system.windows.forms.form
public shared property mainform() as system.windows.forms.form
get
return m_mainform
end get
set(byval value as system.windows.forms.form)
m_mainform = value
end set
end property
end class
新闻热点
疑难解答
图片精选