如何以 ShowDialog() 形式打开表单;我第一次打开表单但 Show();我第二次打开同一个表格

Posted

技术标签:

【中文标题】如何以 ShowDialog() 形式打开表单;我第一次打开表单但 Show();我第二次打开同一个表格【英文标题】:How to open a form as ShowDialog(); the first time I am opening form but Show(); the second time I am opening the same form 【发布时间】:2020-08-07 05:11:11 【问题描述】:
Forms.inDepthScootForm.passProductDetails(strProductName, strProductDescription);
   
Forms.inDepthScootForm.ShowDialog();

Forms.eScootForm.Hide();

我正在尝试打开 inDepthScootForm 并隐藏/关闭 eScootForm。我正在尝试将此表单打开为 ShowDialog();我第一次打开它,但作为 Show();以后我会打开这个表格。

如果我按照这个方法,第二次打开表单时系统会崩溃。

任何帮助将不胜感激。

【问题讨论】:

你必须说出你遇到了什么错误并显示导致它的代码 '已经模态显示的表单不能显示为模态对话框。在调用 showDialog 之前关闭表单。 -- 这是错误 我正在尝试编写 Show();第二次打开表单,但这个错误不断弹出 嗨 Nicholas,请在您的问题中更具体一点,您要打开哪个窗口两次?您的代码在这里没有显示太多,这些行在 eScootForm 中吗?为什么要使用静态/全局变量而不是局部变量窗口等。inDepthScootForm 是否被调用了两次?还是 eScootForm?请给我们一个最小的代码来重现错误。干杯,Slipoch 【参考方案1】:

ShowDialog 仅在关闭后才会返回到您的函数,因此在显示对话框关闭/完成后会调用 hide 函数。

首先可能将其创建为new 对象,这样表单的每个实例都是唯一的(假设您不想在上面保留数据),然后确保它已关闭并在您完成后处置。这应该可以修复窗口已打开的错误。

所以首先隐藏您的第一个表单,然后显示您希望显示的表单。如果你在这里使用 using ,那么如果 showdialog 抛出异常,它仍然会处理它。

using(var win = new Forms.inDepthScootForm())) 
    win.passProductDetails(strProductName, strProductDescription);
    Forms.eScootForm.Hide();
    win.ShowDialog();
 //win gets disposed as soon as the program leaves this

Forms.eScootForm.Show();

如果这不是您想要的,请具体说明,即:“当我第二次显示 x 窗口时,我希望它作为一个节目,而不是一个 showdialog”,但如果您这样做,请确保向我们展示父级它实际上是在调用此窗口,并且在您执行此操作时处于打开状态。

您能否编辑您的问题以包含该行以及引发错误的窗口?

【讨论】:

【参考方案2】:

我想您的“eScootForm”实例是相同的。当您显示并在对话框关闭时处理它时,可能会尝试拥有一个新实例,如下例所示:

public void ShowMyDialogBox()

   var testDialog = new Form2();

   // Show Form2 as a modal dialog
   testDialog.ShowDialog(this);

   // Do things when the dialog is closed
   this.txtResult.Text = testDialog.TextBox1.Text;

   // then dispose it
   testDialog.Dispose();

【讨论】:

public void launchForm() //声明数据类型为inDepthBikeForm的变量 //IndepthScootForm是之前创建的新类类型 //显示新表单 //关闭当前表单 Forms.inDepthScootForm.passProductDetails (strProductName, strProductDescription); Forms.eScootForm.Dispose(); Forms.inDepthScootForm.Show(); Forms.eScootForm.Hide(); 对不起,我不太明白你的方法。我想将表单打开为 Show();第二个但作为 ShowDialog();第一次。有没有办法我可以使用循环或 if 来实现这一点? 如果您处置了您的 eScootForm,之后您将无法使用它。你需要按顺序调用你的东西 //Forms.inDepthScootFrom = new ... //Forms.inDepthScootForm.passProductDetails(strProductName, strProductDescription); //Forms.inDepthScootForm.Hide(); // 从 inDepthScootForm 中获取数据 //Dispose //设置为空 我的主要目的是隐藏第一个表单,因为当我打开第二个表单时它仍然在后台徘徊。 好吧,它看起来更像是一个导航前端设计。需要打开一个新窗口吗?如果不是,您可以在同一个窗口中处理。

以上是关于如何以 ShowDialog() 形式打开表单;我第一次打开表单但 Show();我第二次打开同一个表格的主要内容,如果未能解决你的问题,请参考以下文章

使用 ShowDialog 打开的表单在异常后关闭

从 TabControl 拖动时出现表单 ShowDialog 问题

使用 form.ShowDialog() 时,主窗体中的线程不起作用

使用 ShowDialog() 连接表单

在 Task ContinueWith TaskScheduler.FromCurrentSynchronizationContext 的 ShowDialog 中打开表单时,应用程序会冻结

Rails:如何创建一个添加更多按钮,该按钮使用 jquery 以 erb 形式添加一些文本字段