c#如何允许在ShowDialog()方法调用活动表单的情况下访问一些较低级别的表单?
我得到了一个应用程序,它显示了3个表单:日志窗口,状态窗口,和选项窗口,选项窗口调用了一些其他表单,其中一些表单需要使用showdalog()调用,以返回对话框结果值,以便进一步决策 使用ShowDialog()会引发问题,因为该方法调用的表单排除了其他表单的可访问性 因此,我的问题是,无论调用了多少其他表单,我都希望至少能够访问日志窗口。有没有办法使日志窗口独立于其他表单,或者可以被称为last的表单取代 编辑:c#如何允许在ShowDialog()方法调用活动表单的情况下访问一些较低级别的表单?,c#,winforms,forms,C#,Winforms,Forms,我得到了一个应用程序,它显示了3个表单:日志窗口,状态窗口,和选项窗口,选项窗口调用了一些其他表单,其中一些表单需要使用showdalog()调用,以返回对话框结果值,以便进一步决策 使用ShowDialog()会引发问题,因为该方法调用的表单排除了其他表单的可访问性 因此,我的问题是,无论调用了多少其他表单,我都希望至少能够访问日志窗口。有没有办法使日志窗口独立于其他表单,或者可以被称为last的表单取代 编辑: 我没有提到ShowDialog()提供的行为在我的应用程序中非常有用,我只是缺乏
我没有提到ShowDialog()提供的行为在我的应用程序中非常有用,我只是缺乏将一个或两个表单从锁定状态中释放出来的能力。切换到Show()不是我认为最好的选择,而ShowDialog()调用的表单父级的其他表单仍然需要锁定。因此我现在模拟了您的情况并找到了解决方案:
Show()
ShowDialog
。但是您不需要手动设置对话框结果
FormClosed
事件以获取对话框结果
。例如:
dlg.FormClosed += (o, a) => { this.Text = dlg.DialogResult.ToString(); };
激活事件,以防止在打开对话框时聚焦于父窗口:
if (dlg != null) dlg.Focus();
此解决方案与ShowDialog的系统行为有所不同,但效果良好。您必须在两者之间做出选择
- 使用
,以便父窗体暂停执行,仅在第二个窗体关闭时恢复,或者ShowDialog()
- 使用
,以便父窗体在显示第二个窗体后继续执行Show()
closed
事件
假设第二个表单有一个“First Name”文本框和一个返回该值的属性:
public string FirstName
{
get { return yourFirstNameTextBox.Text; }
}
在第一种形式中,您可以订阅事件,以便在事件发生时采取一些操作,如下所示:
var f2 = new SecondForm();
f2.Closed += (s, e) => MessageBox.Show(f2.FirstName);
f2.Show();
现在用户可以继续使用这两个表单,当第二个表单关闭时,一个消息框将显示“First Name”文本框的值
你可能想做一些比这更有意义的事情。您可以不显示消息框,而是更新第一个表单上的字段,或者执行您想要的任何其他操作或操作集
f2.Closed += (s, e) =>
{
MessageBox.Show(f2.FirstName);
nameLabel.Text = f2.FirstName;
// another action
// yet another action
};
改为使用
Show()
。@Prix我不能用ShowDialog()将数据返回到父窗体。我确信返回的数据还不足以作为不使用Show()
而不是ShowDialog()
@JoriO的理由。事实上,ShowDialog()锁定其他窗体并使特定窗体处于最上方并具有所有焦点,并禁用所有其他表单,但在这种情况下,我需要其中一些表单处于活动状态