知识大全 升级到 .NET

Posted

篇首语:哪有什么四季,遇见你,四季如春。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 升级到 .NET相关的知识,希望对你有一定的参考价值。

VB.NET中的多窗体编程:升级到 .NET  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 前言   在微软 Visual Basic 中 一条简单的 Form Show 语句就能显示项目中的第二窗体 (Form ) 然而 它在 Visaul Basic NET 中却行不通了 因为 NET 版在窗体处理机制上有了很大的变化 刚刚转向 NET 版的 Visaul Basic 程序员实在难以接受这么大的变化 因为现在连 显示第二窗体 这么简单的任务都无从下手 我希望能够通过本文向大家介绍 Visaul Basic NET 与早期的 Visual Basic 在窗体处理机制上有哪些不同之处 以及如何按照 NET 的模式进行多窗体编程    二 Visual Basic 对 Visual Basic NET   窗体(窗体类)正如其它类一样 无论在哪个版本的 Visual Basic 中都是必不可少的 窗体也有属性 方法和事件 且在同一个项目中也允许创建多个窗体实例 (参见 //msdn microsoft /library/en us/off //defInstance asp) 例如 假设你在 Visual Basic 项目中定义了一个窗体 Form 则你可以创建它的 个实例并同时显示出来 代码如下 Dim myFirstForm As Form Dim mySecondForm As Form Dim myThirdForm As Form

Set myFirstForm = New Form Set mySecondForm = New Form Set myThirdForm = New Form

myFirstForm Show mySecondForm Show myThirdForm Show   以上代码用 条 Set 语句生成了 个 Form 实例 你可以把它原封不动地搬到 Visual Basic NET 中运行 它照样能够正确显示 个 Form 窗体 在这里 Form 其实相当于一个普通的类 Visual Basic 允许代码直接访问尚未实例化的窗体类 然而Visual Basic NET 却规定在访问任何类之前都要进行实例化 而且必须借助实例来访问类 这种变化当然有可能造成许多疑惑 Visual Basic 等早期版本能自动生成每个窗体的默认实例 从而允许直接通过窗体名称来访问窗体 例如 在Visual Basic 项目中 可以直接用代码 Form Show 显示 Form 的默认实例 然而在 Visual Basic NET 中 这么做只会引发错误 因为 Visual Basic NET 既不会创建默认的窗体实例 也不允许直接访问尚未实例化的窗体类   这就是 Visual Basic NET 与早期 Visual Basic 在窗体处理机制上的关键区别——你只有先创建窗体实例 然后才可以显示窗体外观 访问窗体属性及其控件 它们还有另一个区别 Visual Basic 项目自动创建的默认窗体实例都能被当成全局变量使用 也就是说 项目中的任何代码都能直接引用窗体 并且每次被引用的都是该窗体的同一个实例 例如 你可以在窗体中 button 控件的 Click 事件处理程序里用代码 Form Show 显示 Form 窗体 然后用下列代码改变 Form 中某个 textbox 控件 (TextBox )的内容 Form TextBox Text = Fred   可是 你在 Visual Basic NET 中运行它却会得到一条错误消息 Reference to a Non Shared Member Requires an Object Reference (引用非共享类成员必须使用对象指针) 这是在提醒你 你正在访问的类尚未进行实例化 有一个简便的解决方案 当你在调试过程中得到上述错误消息时 就把相应的语句 Form Show() 改成 Dim myForm As New Form () myForm Show()   此方案适用于大多数场合 然而 当项目中还有其它代码访问同一个 Form 实例 (比如改变其中 TextBox 的文本) 时 你可能会考虑把下列语句 Form TextBox Text = Fred 改成 Dim myForm As New Form () myForm TextBox Text = Fred   不幸的是 这段代码创建了一个新的 Form 实例 结果你所访问的窗体不再是原先的 Form 这岂不麻烦了!更坏的是 你不会因此而得到任何错误消息提示 同时你先前调用 Show() 显示的 Form 窗体也不会发生任何变化   三 升级向导如何解决它   如果你用升级向导 (Upgrade Wizard) 把 Visual Basic 项目升级为 Visual Basic NET 版 则它会在每个窗体中自动添加一段特殊代码 通过显式创建窗体实例来模拟早期 Visual Basic 版本中的默认实例化机制 此段代码被包裹于标号为 Upgrade Support 的代码区块内 借助一个新增的 Shared 属性来生成当前窗体的实例 Private Shared m_vb FormDefInstance As Form Private Shared m_InitializingDefInstance As Boolean Public Shared Property DefInstance() As Form Get If m_vb FormDefInstance Is Nothing _ OrElse m_vb FormDefInstance IsDisposed Then m_InitializingDefInstance = True m_vb FormDefInstance = New Form () m_InitializingDefInstance = False End If DefInstance = m_vb FormDefInstance End Get Set(ByVal Value As Form ) m_vb FormDefInstance = Value End Set End Property   代码中的 DefInstance 是一个 Shared 属性 它能以 窗体名 DefInstance 的形式直接访问 它所在项目中的任何代码访问它都将得到同一个窗体实例 这样 你就能模拟 Visual Basic 项目对窗体的直接引用了 只不过在代码中以 Form DefInstance 代替 Form 而已   这时 你只需用 Form DefInstance Show() 和Form DefInstance TextBox Text = Fred 分别替换原先对 Form 相应的直接引用就大功告成了 假如你不用升级向导 而是在 Visual Basic NET 窗体中手工插入上述代码 (以及升级向导在窗体的 New过程中自动添加的代码) 也行 当然了 你并不一定非要修改窗体代码 因为有一种编程模式可以在 NET 项目中模拟默认窗体实例的创建 本文将用余下的篇幅来介绍这种编程模式   四 NET 窗体之间的交互   在 Visual Basic 等早期版本中 多个窗体之间的交互通常需要借助默认窗体实例来完成 下面我将结合某些具体的编程任务来讲解如何在 NET 下实现多窗体交互 希望它能对你的开发任务有所帮助   1 保持窗体引用的全局性   前面提到 进行 NET 窗体编程时应该牢牢把握下列原则 在访问窗体之前 你必须进行窗体实例化 如果在项目中有多处代码访问同一窗体 则你必须把它的同一实例指针传递给这些代码 对于早已习惯了直接把默认窗体实例当成全局变量来使用的 Visual Basic 程序员来说 这可是个严重的挑战 好在 NET 为你提供了两条出路 其一 把窗体实例指针保存在全局变量中 其二 把窗体实例指针传递给任何需要访问它的窗体 类 模块或者过程   2 NET 中的数值全局化   我以前曾经指出 Visual Basic NET 不支持全局变量 现在我又要说 在 NET 中可以在某种程度上实现数值全局化 这算不算此一时 彼一时?不 我不是那种人 Visual Basic NET 确实不支持全局变量 然而它借助 Shared (相当于 C# 中的 static) 变量却能模拟全局变量 事实上 前面介绍的 Visual Basic 升级向导自动添加到窗体代码中的 DefInstance 属性就是 Shared 类成员 无论容纳 DefInstance 属性的窗体类是否已经实例化 它都能被项目中的任何代码所引用 象这样的 Shared 属性不就相当于全局变量吗?因此 你可以创建这样的类 Public Class myForms Private Shared m_CustomerForm As CustomerForm Public Shared Property CustomerForm() As CustomerForm Get Return m_CustomerForm End Get Set(ByVal Value As CustomerForm) m_CustomerForm = Value End Set End Property End Class   你需要在首次实例化一个窗体时 把该窗体的实例保存到一个类中 Dim myNewCust As New CustomerForm() myNewCust Show() myForms CustomerForm = myNewCust   这里的 CustomerForm 属性值就是你的窗体实例 于是 其它代码就能从项目的任何地方通过它来间接访问你的窗体了 Module DoingStuffWithForms Sub DoExcitingThings() myForms CustomerForm Text = _ DateTime Now() ToLongTimeString End Sub End Module   象这样把窗体实例保存为属性值就能按照你的要求模拟 Visual Basic 中的全局变量 如此模拟的 全局变量 其作用域比类域 (class scope) 高一个层次 所谓类域 是指变量仅仅在定义它的类(确切地说 应该包括模块 类或窗体)中有效 比类域还低一层次的是过程域 (procedure scope) 即变量仅仅在定义它的例程中有效   3 窗体指针在项目中的传递   除了把窗体实例全局化以外 你还可以把窗体类指针保存在变量中传递给需要访问该窗体的例程 假设你有一个窗体 Form 并希望在点击 Form 中某个按钮 (Button ) 时打开另第二窗体 Form 然后在点击第二窗体 Form 中的另一个按钮 (Button ) 时进行某项计算 你可以把整个代码都写在 Form 中 即 Public Class Form Inherits System Windows Forms Form Dim myForm As Form

Private Sub Button _Click(ByVal sender As System Object _ ByVal e As System EventArgs) Handles Button Click myForm = New Form () myForm Show() End Sub

Private Sub Button _Click(ByVal sender As System Object _ ByVal e As System EventArgs) Handles Button Click Calculations CompoundInterestCalc(myForm ) End Sub End Class   无论是把窗体指针全局化 还是把它以参数的形式传递 都是可行的 然而 你必须根据项目的需要选择最佳方案 当 NET 项目中只有少数几个过程需要访问特定窗体时 我建议你给这些过程增加一个参数 以在必要时接受窗体指针 当你的项目有太多过程需要访问该窗体时 你就应该考虑设置一个全局窗体指针变量 当然了 你最好还是考虑调整项目代码结构 使得真正访问该窗体的类或者过程只有一个 如果你希望用窗体来显示登录信息 则你可以先创建一个类 把窗体实例保存为它的 Shared 类成员 然后添加一个 Shared 方法 WriteToLogWindow 来完成实际的窗体访问 于是 项目中的任何代码只需调用此 WriteToLogWindow 方法就能间接访问显示登录信息的窗体了 Public Class Log Private Shared m_LogForm As Form Public Shared Property LogForm() As Form Get Return m_LogForm End Get Set(ByVal Value As Form ) m_LogForm = Value End Set End Property

cha138/Article/program/net/201311/15749

相关参考

知识大全 ASP.net升级后Form认证无法登录问题

ASP.net升级后Form认证无法登录问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  AS

知识大全 ASP.NET2.0实现网站的自动升级

ASP.NET2.0实现网站的自动升级  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  网站的自动

知识大全 公布.NET Framework 2.0升级3.5方案

公布.NETFramework2.0升级3.5方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 .NET Framework 2.0升级3.5认证方案

.NETFramework2.0升级3.5认证方案  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 .net winform软件自动更新

  关于NETwindows软件实现自动更新本人今天写了一个DEMO供大家参考  大家先看下效果图    主要涉及到两个方面  更新软件主项目和DLL文件  升级包自身的更新     &nb

知识大全 苹果4代手机5.0.1要怎样才能升级到ios 5.1

苹果4代手机5.0.1要怎样才能升级到ios5.1楼主您好你可以用电脑到苹果官网下载一个itunes安装在电脑上打开软件连接手机就会出现更新系统只需点击更新即可升级苹果4怎样才能升级到iOS8呢?苹果

知识大全 Oracle 8i 到 9i 升级之路

Oracle8i到9i升级之路  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!      在i中其实

到2016年底,中国石油集团的汽、柴油将全部达到__要求,确保按照国家的油品质量升级时间表完成升级

到2016年底,中国石油集团的汽、柴油将全部达到_____要求,确保按照国家的油品质量升级时间表完成升级。A、国III标准B、国IV标准C、国Ⅴ标准D、国VI标准答案:C

知识大全 升级到SQL Server 2008的详解步骤

升级到SQLServer2008的详解步骤  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  目前S

知识大全 百度百科怎么样升级快,能够到四级的

百度百科怎么样升级快,能够到四级的?你可以在百科右上角点"我的百科"进入"我的任务",做任务是方法之一,另外你可以到百科商城去兑换加速经验的卡片道具“版本双倍经验卡“,在编辑百科时使用它,可以加速经验