在 C# Winform 上使用显示对话框时出现非常奇怪的错误

2023-12-06

我在 VS Studio 2008 Express Edition 中创建了 2 个表单,并在主 program.cs 文件中使用 public static 声明它们

我只想使用 ShowDialog 和 Close 在两个表单之间切换,但是当尝试关闭第二个表单并使用 showdialog 再次打开第一个表单时,它说当表单已经可见时我无法使用 showDialog,但事实并非如此,因为我之前关闭它以显示第二种形式。

它要求我在使用 showdialog 之前将表单可见属性设置为 false,所以我这样做了

    internal static void CloseSecondForm(FirstForm FirstForm)
    {
        FirstForm .Close();
        SecondForm.Visible = false;
        SecondForm.ShowDialog();
    }

但随后它说我无法使用 ShowDialog,因为表单已在对话框模式下显示,我必须关闭它。所以我按照它的要求做了

    internal static void CloseSecondForm(FirstForm FirstForm)
    {
        FirstForm .Close();
        SecondForm.Visible = false;
        SecondForm.Close();
        SecondForm.ShowDialog();
    }

但它仍然假装表单已经用 ShowDialog 打开!

这是我的程序或 Winform 中的错误吗?

更新:这是我在第五个答案中发布的完整代码(我想使用 showdialog 而不是显示,因为我可能在后台有第三个表单,我不希望用户访问):

  [STAThread]
  static void Main()
  {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Form1 = new Form1();
      Form2 = new Form2();
      Form1.ShowDialog();
      Application.Run();

  }

  // called from Form1 BUTTON
  internal static void ShowForm2(Form1 Form1)
  {
      Form1.Hide();
      Form2.ShowDialog();
  }

  // called from Form2 BUTTON
  internal static void ShowForm1(Form2 Form2)
  {
      Form2.Hide();
      Form1.ShowDialog();
  }

我按照建议尝试了隐藏,但它也不起作用。这就是整个程序,我想做的非常简单:我最初在程序中创建了两个表单,每个表单上都有一个按钮来关闭自身并打开另一个。我将所有逻辑放在下面的program.cs中:

  using System;
  using System.Windows.Forms;

  namespace twoforms
  {
      static class Program
      {
          /// <summary>
          /// The main entry point for the application.
          /// </summary>
          /// 
          public static Form1 Form1;
          public static Form2 Form2;

          [STAThread]
          static void Main()
          {
              Application.EnableVisualStyles();
              Application.SetCompatibleTextRenderingDefault(false);
              Form1 = new Form1();
              Form2 = new Form2();
              Form1.ShowDialog();
              Application.Run();

          }

          // called from Form1 BUTTON
          internal static void ShowForm2(Form1 Form1)
          {
              Form1.Hide();
              Form2.ShowDialog();
          }

          // called from Form2 BUTTON
          internal static void ShowForm1(Form2 Form2)
          {
              Form2.Hide();
              Form1.ShowDialog();
          }
      }
  }

这是你的程序中的一个错误。当您有一个窗体的两个实例(称为 A 和 B)时,您显然无法使用 ShowDialog 连续显示一个窗体。如果你能做到这一点,那就意味着 A 以模态方式显示 B,然后 B 以模态方式显示 A,然后 A 以模态方式显示 B,等等。这就像用两块砖建造一座房子,你只需继续拿走底部的砖块,然后将其放在另一个之上。

最好的解决方案是不要使这些表单静态化,而是根据需要创建每个表单的新实例。您的第二个最佳解决方案是使用 Show 而不是 ShowDialog;如果您一次只显示其中一种表单,则 ShowDialog 没有任何意义。

静态形式几乎总是一个坏主意(我对“几乎”很客气)。如果您的表单需要很长时间才能创建,您应该确定哪些资源需要很长时间才能加载并将其缓存为静态对象,而不是尝试将整个表单缓存为静态。

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

在 C# Winform 上使用显示对话框时出现非常奇怪的错误 的相关文章

  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如果我使用客户端计算机上未安装的字体,会发生什么情况?

    有人可以告诉我 如果我在 WinForms 应用程序中使用目标计算机上不可用的字体 会发生什么情况 它是否使用同一系列的字体 只是 Sans Serif 还是其他字体 您的应用程序将回退到 Segoe UI Tahoma 然后是 MS Sa
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • R:覆盖栅格图层的xy坐标

    我有一个带有 XY 像素坐标的栅格 我想将其转换为纬度和经度 class RasterLayer dimensions 1617 1596 2580732 nrow ncol ncell resolution 1 1 x y extent
  • 使用 C# Process 运行可执行程序

    我是一名生物信息学人员 我的工作使用 C 我已经多次使用 C 中的进程来运行可执行程序 这次我有一个新问题 我在 Windows 中下载了一个名为 Blast 的程序的 exe 文件 如果我输入我的命令 blastp query input
  • python 中 GSDMM 的实际示例?

    我想使用 GSDMM 将主题分配给我的数据集中的一些推文 我发现的唯一例子 1 and 2 不够详细 我想知道您是否知道一个显示 GSDMM 是如何使用 python 实现的来源 或者足够关心做一个小例子 我最终编译了 GSDMM 的代码
  • 无法升级Android SDK

    我已经关闭了所有窗口 重新启动了计算机 但 Eclipse 告诉我 C Program Files android sdk tools 正在被访问 我什至删除了该目录 但我仍然得到 如何修复 无法重命名目录 C Program 文件 And
  • 使用 ToString() 格式化时小数和双精度之间的舍入差异

    使用格式化数值时我发现结果存在差异ToString F2 0 125m ToString F2 CultureInfo InvariantCulture 0 13 0 125 ToString F2 CultureInfo Invarian
  • 将所有并排单词成对分割字符串单词[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我需要将字符串分割成单词 然后将每个连续的单词成对连接 如下所示 This is my
  • 检查文件/文件夹访问权限

    我得到一个UnautorizedAccessException运行这段代码 string fileList Directory GetFiles strDir strExt 异常发生在c users username appdata如何检查
  • Worklight 构建错误无法初始化 ClientProjectBuilder

    我突然开始收到如下所示的工作灯构建错误 我不知道为什么它突然开始发生 该代码工作正常 直到我用于 Xcode 构建的远程计算机重新启动 有什么线索可能导致它吗 ipad 构建失败 初始化 ClientProjectBuilder 失败 an
  • Amazon sns(推送通知)不发送到 IOS 应用程序

    最近app收不到通知 android端正常 ios端却失败 所以这就是我的尝试 1 generate token from apple apn service 2 create the endpoint at amazon backend
  • 代码行分析器是否需要解析树,这是否足够?

    我正在尝试确定为某种语言 例如可用于 Python 和 Matlab 的语言 编写线路分析器所需的条件 解释 行分析器 的一种天真的方法是假设可以在每一行周围插入时间记录 但行的定义取决于解析器如何处理空格 这只是第一个问题 似乎需要使用解
  • 跳出包含 switch 语句的 while 循环

    我无法弄清楚如何跳出包含 switch 语句的循环 Break 从开关中中断 而不是从循环中中断 可能有一个更优雅的解决方案 我已经实现了一个标志 该标志一开始为 true 然后设置为 false 然后结束循环 您能提供更好的解决方案吗 背
  • Dash Plotly 日期时间选择

    Dash 世界中是否有任何东西可以提供一个很好的界面来输入日期时间 时间增量 无论什么类型 np pd dt 等 我目前只能找到真正支持日期的代码https dash plotly com dash core components date
  • 如何循环遍历动态表单输入并将其插入数组

    我有一个表单 要求用户在多个表单字段中输入数字 他们可以选择他们想要的表单字段数量 我已将表单字段标记为 df1 df2 df3 等 对于用户添加的每个额外表单字段 只需在 df 后面的数字上加 1 我的问题是尝试捕获 使用 PHP 这些字
  • 如何使用模拟匿名类型的设置?

    我有以下存储库 interface IReportingRepository where T Report IEnumerable
  • Heroku + node.js 错误(Web 进程未能在启动后 60 秒内绑定到 $PORT)

    我有我的第一个node js应用程序 在本地运行良好 但我无法通过heroku部署它 也是第一次使用heroku 代码如下 SO 不允许我编写这么多代码 所以我只想说在本地运行代码以及在我的网络中都没有问题 var http require
  • 如何使用 Jasmine 测试 AngularJS 控制器的 Promise 返回值?

    我有一个控制器 它公开一个函数 该函数在休息调用后返回一些文本 它工作得很好 但我在用 Jasmine 测试它时遇到了麻烦 测试中 Promise 处理程序内的代码永远不会执行 控制器 global Q use strict angular
  • 避免打印到控制台的字符串被截断(在 RStudio 中)

    我想将一个长字符串打印到 RStudio 控制台 这样它就不会被截断 gt paste 1 300 letters collapse 1 1 a 2 b 3 c 4 d 5 e 6 f 7 g 8 h 9 i 181 y 182 z 183
  • 如何在硒的新选项卡中滚动

    我通过单击 c 中的 selenium 中的某些内容打开了一个新选项卡 我想在更改到新选项卡后滚动 但出现超时错误 我收到超时消息并且没有滚动 这是 C 代码 二手 Chrome 79 Chrome 选项是 options AddArgum
  • 将因子转换为指示变量? [复制]

    这个问题在这里已经有答案了 如何将 R 中的一个因子转换为多个指标变量 每个级别一个 一种方法是使用model matrix model matrix Species iris Intercept Speciesversicolor Spe
  • 在 C# Winform 上使用显示对话框时出现非常奇怪的错误

    我在 VS Studio 2008 Express Edition 中创建了 2 个表单 并在主 program cs 文件中使用 public static 声明它们 我只想使用 ShowDialog 和 Close 在两个表单之间切换