【发布时间】:2019-06-25 01:55:07
【问题描述】:
我有一个使用 ShowDialog() 显示的表单,因此它是一个模式窗口。
private void OpenForm(object sender, ItemClickEventArgs e)
{
MyForm testForm = new MyForm();
...
testForm.Enabled = true;
testForm.ShowDialog(this);
var dialogOk = testForm.DialogOK;
if(dialogOk)
{
//do some stuff 1
}
}
表单上有一个“确定”按钮。单击确定时,DialogOk 设置为 true。 MyForm 类内部:
private void OkClick(object sender, EventArgs e)
{
// do some stuff 2
...
DialogOK = true;
Hide();
}
我需要将其转换为非模态窗口。解决方案似乎是使用 Show() 而不是 ShowDialog(),但是当我使用 Show() 时,代码不会停止并等待单击 OK 按钮,因此永远不会调用“do some stuff 1”。
使用 Show(),如何在单击 OK 按钮后保持“做一些事情 1”的行为?
更新:这是我现在正在尝试的:
public partial class MyForm: XtraForm
{
public bool DialogOk;
private void OkClick(object sender, EventArgs e)
{
// do some stuff 2
...
DialogOk = true;
Close();
}
}
方法一:
public partial class MyMainForm : XtraForm
{
private MyForm testForm;
private void OpenForm(object sender, ItemClickEventArgs e)
{
if(testForm == null)
{
testForm = new MyForm();
}
...
testForm.Enabled = true;
testForm.FormClosed += (s, a) => {
var dialogOk = testForm.DialogOk;
if (dialogOk)
{
// do some stuff 1
}
};
testForm.Show(this);
}
}
方法二:
public partial class MyMainForm : XtraForm
{
private MyForm testForm;
private void OpenForm(object sender, ItemClickEventArgs e)
{
if(testForm == null)
{
testForm = new MyForm();
}
...
testForm.FormClosed += testForm_Closed;
testForm.Show(this);
}
private void testForm_Closed(object sender, EventArgs args)
{
var testForm = (Form)sender;
testForm.Closed -= testForm_Closed;
if (testForm.DialogResult == DialogResult.OK)
{
// do some stuff 1
}
}
}
【问题讨论】:
-
一种方法是让对话框窗体在单击 OkClick 时调用父窗体(作为参数传递给它)内的方法或事件。
-
我很困惑。你能解释一下为什么你需要一个非模态窗口来表现得像一个模态窗口吗?听起来您应该保持窗口模式。
-
由于您想锁定主界面的执行,直到在第二个窗口上单击“确定”按钮,所以在我看来,您需要的实际上是一个模态窗口。
-
@GabrielLuci 我需要能够点击当前模式窗口之外的其他窗口。
-
顺便说一句,
Form有一个名为DialogResult的属性 - 将其设置为DialogResult.Ok它将自动隐藏表单并返回值 - 因此您的代码将更改为if(testForm.ShowDialog(this)==DialogResult.Ok)
标签: c# winforms show showdialog