如何以 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();我第二次打开同一个表格的主要内容,如果未能解决你的问题,请参考以下文章
从 TabControl 拖动时出现表单 ShowDialog 问题
使用 form.ShowDialog() 时,主窗体中的线程不起作用
在 Task ContinueWith TaskScheduler.FromCurrentSynchronizationContext 的 ShowDialog 中打开表单时,应用程序会冻结