导致这种类似于 VB6 的气味(VB.NET 允许)出错:WinFormType.InstanceProp=Value [DISABLE My.Forms]

2023-12-19

我注意到 VB.Net 对 Winform 对象的处理有一些非常令人讨厌的地方。

这浪费了我们几个小时的时间。情况只会变得更糟,因为我们有更多的 VB6 程序员习惯于做这样的事情,并且自动转换的代码直接从 vb6 带来了构造。

这是一种可以接受的做事方式:

Dim FormInstance as New FormClassName
If FormInstance.ShowDialog() = DialogResult.OK then
    TheAnswer = FormInstance.TextBox1.Text
EndIf

但是,它允许这样做:

If FormClassName.ShowDialog() = DialogResult.OK then
    TheAnswer = FormClassName.TextBox1.Text
EndIf

请记住,属性和方法不是共享的。应用程序框架的转变并不重要。 VB 似乎在幕后实例化了表单的全局副本,并将此语法重新路由到该全局引用。您可以想象这对现代程序造成的严重破坏!通常开发人员会把它扔进去,否则我们会错过清理转换中一些晦涩代码的机会(是的,我现在正在寻找这个,所以这会有所帮助)。

我可以进行的任何设置都会导致抛出错误消息,例如,Reference to a non-shared member requires an object reference,就像应该的那样?

这是解决方案:

我选择选择jmoreno的答案,因为他为我指出了罪魁祸首:My.Forms。修复它就像将其放入模块中一样简单:

Namespace My.MyProject.MyForms
End Namespace

然后你就会得到我上面提到的确切错误。就像你应该的那样。如果您需要旧版应用程序(这是一件好事),那么不要这样做!我以为 Gserg 可能只是在抨击 VB(有趣但没有帮助),但他立即提到了这一切,自从我找到答案后,我们再次同意 VB 不烂,除非你只是不熟悉它。

请注意,如果您使用应用程序框架,您将在 application.designer 中收到您不希望出现的错误。修复:

    Protected Overrides Sub OnCreateMainForm()
        ''//was: Me.MainForm = Global.WindowsApplication2.Form1
        Me.MainForm = New Form1
    End Sub

希望这就是任何不良副作用的原因!

JMoreno的反思等

上面的内容非常简单,我不想提出其他任何建议,但如果您好奇,这里有对该代码的改进,以(1)添加反射以省略必须在您制作的每个表单中进行硬编码,以及(2)自动制作它强制执行(只需在程序启动时调用该子程序一次)。只需将其放入模块中即可:

Public Sub FixMyForms()
    For Each pi As System.Reflection.PropertyInfo In GetType(My.MyProject.MyForms).GetProperties
        Dim obj As Object = pi.GetValue(My.Forms, Nothing)
        If TypeOf obj Is Form Then
            AddHandler CType(obj, Form).Load, AddressOf Complainer
        End If
    Next
End Sub

Private Sub Complainer(ByVal sender As Object, ByVal e As System.EventArgs)
    MsgBox("WRONG!")
End Sub

不会。这种令人困惑的行为是设计使然。

在 VB 中可以使用窗体的一个实例而不创建它,并且这一行为很高兴地出现在 VB.NET 中。对我来说,这是最糟糕的设计选择之一。
但它确实使遗留项目的转换变得更容易。它对那些甚至不知道可以显式实例化表单的人有好处。

但您不需要使用此技巧,因为您从未使用过 VB6。在这两种语言中,您都可以使用显式创建的实例,在这种情况下,将不会创建默认实例。只要忘记这个“特征”的存在,只在启发他人时才让它回到你的脑海中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导致这种类似于 VB6 的气味(VB.NET 允许)出错:WinFormType.InstanceProp=Value [DISABLE My.Forms] 的相关文章

  • 错误:查询值的数量和目标字段的数量不相同

    Public Class RoomInfo Dim ValTx As String Dim ValNr As Integer Private Sub cboRoomType DropDown sender As System Object
  • 如何查找局域网中所有主机上正在运行的程序的所有实例?

    出于实际目的 SqlDataSourceEnumerator 的作用是查找在 LAN 上的各个 PC 上运行的 SQL Server 的所有实例 是否有等效的方法可以查找任意应用程序的运行实例 编辑 好的 所以这只有效 因为这些应用程序有预
  • 即使在 GC Collect 和 WaitForPendingFinalizers 之后,窗口对象在关闭后也未释放?

    这是一个简单的测试应用程序 可帮助了解 WPF 内存使用情况 我想了解的关键是为什么MainWindow即使在关闭并等待 GC 完成之后 仍然被引用并且它的内存没有被释放 参见下面的代码清单 文本 MainWindow Finalizer
  • Visual Studio 2022 - 编译旧应用程序时出错

    我们正在尝试在 Visual Studio 2022 中使用 VB6 32 位应用程序 编译 2002 年以来非常旧的应用程序 我们需要调试此应用程序并能够在 Windows 10 计算机上运行此应用程序 编译时 我们发现以下错误 这似乎是
  • 为什么我的 COM 对象不显示组件服务中的方法?

    我正在尝试创建一个 COM 对象并将其注册到 COM 下 一切似乎都很顺利 但是当我查看组件服务并深入了解时 控制台根目录 组件服务 电脑 我的电脑 COM 应用程序 测试通讯 组件 TestCom Com MyCom 接口 MyCom 方
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所
  • WinForms 中的 EF:如何过滤 BindingSource/DGW 中的数据 (.Local.ToBindingList())

    我按照本教程生成了 EF 模型 首先是数据库 和数据源http msdn microsoft com en us data jj682076 aspx http msdn microsoft com en us data jj682076
  • 创建动态多维对象/数组

    我正在尝试使用 JS 创建一个多维数组 以便我可以通过 Ajax 调用 PHP 来发布一些数据 这可能很简单 但我对 JS 的了解很少关于这个具体的事情 这是带有代码的 JSFiddle http jsfiddle net k5Q3p 我想
  • 如何获取Winforms窗体标题栏高度的大小?

    因此 如果它是工具窗口或可最小化的表单 我希望能够以编程方式获取其高度 这可能吗 如果是这样怎么办 您可以使用以下方法确定工具窗口和普通表单的标题栏高度 Rectangle screenRectangle this RectangleToS
  • 当我使用 Image.FromFile() 时 FileNotFound

    我在这种情况下使用 Image FromFile string 方法 using System using System Collections Generic using System ComponentModel using Syste
  • c#.NET 和 sprintf 语法

    这段代码如何翻译成 C 具体来说是如何sprintf用C 实现 string output The user s logged in string loggedIn is string loggedOut isn t if TheUser
  • 删除DataGridView(表)中的多行

    我有一个数据表 myTable 它与 DataGridView dgv 绑定 DataGridView dgv 有一个复选框列 我的目标是删除在按钮事件中选中的行 数据表当然会更新 现在我的代码仅适用于删除一行 不适用于多行 感谢帮助 pr
  • 如何获取 TextRenderer 使用的确切文本边距

    System Windows Forms TextRenderer DrawText方法根据 的值呈现带或不带左右填充的格式化文本flags范围 TextFormatFlags NoPadding 将文本紧密地装入边界框 TextForma
  • 如何等待远程 .NET 调试器连接

    今天我遇到了一个问题 我需要远程调试程序 该程序是从另一个系统启动的 所以我真的没有机会在命令行上与它交互 不过我可以很容易地改变它的来源 我需要做的是让程序正常启动 然后等待我用调试器附加到它 我想不出一个让我快乐的方法 我确实发现了这个
  • .NET“默认行终止符”?

    有什么方法可以弄清楚 NET 使用什么作为其 默认行终止符 例如 StringBuilder AppendLine String 的文档表示 附加指定字符串的副本 后跟默认行终止符 NET 中的几个与文本相关的类引用相同的概念 有什么方法可
  • 随机数但不重复

    我想生成一个小于 50 的随机数 但一旦生成该数字 我希望它不能再次生成 谢谢您的帮助 请参见 费舍尔 耶茨洗牌 http en wikipedia org wiki Fisher E2 80 93Yates shuffle public
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器

随机推荐

  • (function(){})() 和 (function(){}()) 之间的区别,自调用匿名函数[重复]

    这个问题在这里已经有答案了 看看括号的位置 有什么不同吗 函数 function 和 func function 从技术上讲 第一个定义了一个匿名函数 然后调用它 第二个定义了一个匿名函数 该函数在定义时调用自身 实际上 它们是相同的
  • 执行命令时如何在atom中设置环境变量

    我正在尝试将我的环境变量设置为 env DEBUG babel 但我不知道在 Atom 编辑器中哪里可以使用这个设置 要使 shell 的环境变量可供 Atom 使用 请安装以下两个小 Atom 包 来自 shell 的环境 https a
  • PHP 检测 Fetch Api 与 XMLHttpRequest

    截至目前 我的网站正在使用 jQuery Ajax 从前端向后端发出请求 然后后端通过检查 SERVER HTTP X REQUESTED WITH XMLHttpRequest 来确定 ajax 请求 我正在尝试仅切换到本机 JS 并且想
  • 访问公共 AWS s3 存储桶

    我们一群朋友正在做一个 Map Reduce 项目 并且正在处理一个通用数据集 我的朋友已使用他的 AWS 帐户将数据上传到 s3 存储桶 并将 s3 存储桶策略设置为 Version 2008 10 17 Id Policy1417380
  • 特征仅适用于对象吗?

    又在尾巴上这个问题 https stackoverflow com q 68575795 891440 我正在尝试做一个will特质工作 使用这个 打高尔夫球的 代码 sub show value a var say Value of a
  • 通用构造函数和反射

    是否可以看出哪个构造函数是通用构造函数 internal class Foo
  • 执行策略“SqlServerRetryingExecutionStrategy”不支持用户启动的事务

    我有一个 ASP NET Core 5 MVC Web 应用程序 使用 Entity Framework Core 5 我们实现 Web 组件 例如网格或电子表格 我们与 Telerik 合作 当我在组件中进行一些更改 然后尝试保存更改时
  • Highcharts 气泡图数据标签重叠

    如图所示 与小提琴的代码不同 但显示了问题 使用 Highcharts 新的气泡图 数据标签似乎喜欢坐在彼此的顶部 有一个简单的解决方法吗 我很乐意在每个标签的基础上手动更改 z index 但这似乎不适用于气泡图 这是一些无法按预期工作的
  • Matlab 中的 KNN 回归

    Matlab中的k近邻回归函数是什么 只有knn分类功能可用吗 有人知道与此相关的任何有用的文献吗 Regards Farideh 我不相信 k NN 回归算法是直接在 matlab 中实现的 但是如果你进行一些谷歌搜索 你可以找到一些有效
  • 将多个命令绑定到屏幕中的单个键?

    如何将多个命令绑定到 gnu screen 中的一个键 我想合并两个映射 bind c copy bind b eval writebuf exec sh c xsel clipboard lt tmp screen exchange 到单
  • youtube - 无法在轮播/滑块中滑过 iframe

    我有一个带有轮播的响应式网站 用户可以将 YouTube 视频嵌入为其中一张幻灯片 在桌面上这工作正常 然而 在移动设备上 iframe 显然会吃掉所有滑动事件 并且您无法滑过视频 我们必须通过替换视频图像然后使用来解决这个问题window
  • Javascript 事件 addEventListener 为同一函数注册多次;使用 OOP JavaScript

    我正在使用面向对象的 Javascript 并结合注册事件侦听器 根据我对事件监听器的理解 如果应用于 eventtarget 的函数已经注册 则重复尝试添加相同的事件监听器将被忽略 换句话说 它应该只触发一次 但下面的代码并非如此 也可以
  • 使用 JSON 序列化/反序列化 Pandas DataFrame 时如何保留索引的时区

    我需要使用以下方法将 Pandas DataFrame 序列化为 JSONto json方法 这是我如何做到这一点的一个例子 import pandas import numpy as np dr pandas date range 201
  • Hibernate - 第二个查询给出未知的服务请求

    我试图更好地理解 Hibernate 的工作原理 我有一个无法解决的问题 当应用程序启动时 它会进行查询 Session session HibernateUtil getSessionFactory getCurrentSession s
  • 在内部专用网络上保护 SOAP Web 服务的最佳方法是什么

    如今 越来越多的 Web 服务是为内部使用而开发的 用于将应用程序连接在一起 我们没有 ESB 来控制和保护此 Web 服务 因此我猜测什么是保护它们的好方法 我们尝试设置双向 SSL 但无法控制特定 Web 服务的授权 我的需要是能够控制
  • 通过输入前几个字符跳转到列表框项目

    我有一个项目列表 可能很大 用户必须从中选择一个 我想允许用户输入前几个字母所需项目的跳转到列表中的正确位置 默认情况下 每次按键都会跳转到以该字母开头的第一个项目 因此您无法键入第一个项目several字母 有什么简单的方法可以做到这一点
  • golang 切片分配性能

    在检查 GO 中内存分配的性能时 我偶然发现了一件有趣的事情 package main import fmt time func main const alloc int 65536 now time Now loop 50000 for
  • 如何从 Postgres 中的 CTE(公用表表达式)删除记录

    我在 Postgres 中使用 CTE 编写了以下查询 现在我无法从中删除记录 WITH cte AS SELECT firstname lastname country ROW NUMBER OVER PARTITION BY first
  • 配置 Hudson 来部署构建

    我正在尝试配置 Hudson 以便能够自动将构建 war 文件 部署到 Tomcat 然后 新部署的构建将被某人用来测试应用程序 我尝试使用部署插件自动部署 war 文件 这有效 但是 构建 war 文件的作业将在每次 scm 更改后 每当
  • 导致这种类似于 VB6 的气味(VB.NET 允许)出错:WinFormType.InstanceProp=Value [DISABLE My.Forms]

    我注意到 VB Net 对 Winform 对象的处理有一些非常令人讨厌的地方 这浪费了我们几个小时的时间 情况只会变得更糟 因为我们有更多的 VB6 程序员习惯于做这样的事情 并且自动转换的代码直接从 vb6 带来了构造 这是一种可以接受