我有一个Dialog,显示有关对象的一些信息。我想关闭此对话框以显示相同的对话框,但现在显示对象的兄弟。这是一个复杂的对话框,根据分配的对象加载不同的组件,我不能只是更改对另一个对象的引用 我尝试在Closed事件中启动新的,但前者没有从屏幕上消失并继续显示。还尝试了一个在Dialog中称为whith的静态方法,将相同的Dialog作为参数传递,因此它关闭对话框'dialog.Close()'并打开一个带有要显示的新对象的新对话框。但是前者仍然落在后面。 有没有办法实现这一点,关闭第一个窗口并打开第二个窗口?
(这是静态方法,参数传递的窗口在创建的新窗口关闭之前不会关闭)
// From the Dialog try to launch the second one closing this.
private void btnSibling_Click(object sender, EventArgs e)
{
SwitchToSibling(this);
}
private static void SwitchToSibling(SiblingDialog window)
{
try
{
double id = 0;
id = window.SelectedSibling();
if (id != 0)
{
// Get's the same Parent so to the new Dialog
Control owner = window.Owner;
window.Close();
Sibling sibling= Sibling.Get(id);
SiblingDialog.ShowSibling(sibling, false, owner);
}
}
catch (GroupException ex)
{
MessageBox.Show(ex.Message);
}
}
答案 0 :(得分:1)
我遇到了同样的问题,经过大量的故障排除后,我设法以完全不同的方式解决了这个问题:我首先等待Forms.Application.LeaveThreadModal事件发生,然后我等待下一个Forms.Application .Idle事件发生。到那时第一个对话框已经完全消失,因此可以毫无问题地启动第二个对话框。
仅等待空闲事件,或仅等待离开线程模式事件,或者以相反顺序等待这两个事件,将不起作用。
注意:只等待空闲事件APPEARS工作,但只有通过用鼠标单击第一个对话框的按钮才能激活第二个对话框。如果通过按键盘上该按钮的助记键来触发按钮,第二个对话框将出现在第一个对话框的上方!你必须完成我描述的序列才能避免这种情况!
在考虑了一点之后,在我看来,我的解决方案有点“神奇”,这意味着它可能会停止在未来的dotnet框架版本中工作,所以我想我会抛弃它并关注Mike Hoffer的建议,据我所知,这与jmayor给自己的答案基本相同,并标记为被接受。 (事实是Mike Hoffer的回答有点难以理解。)
答案 1 :(得分:0)
在不知道Sibling
和SiblingDialog
类中的具体内容的情况下,确定可以。唯一的限制是,如果关闭作为应用程序主窗口的窗口,应用程序将退出。
private static void CloseAndShow(Form formToClose, Form formToShow)
{
formToClose.Close();
formToShow.Show();
}
这将关闭formToClose
并显示formToShow
。
答案 2 :(得分:0)
如果您已为第一个对话框设置了所有者,并且您知道其类型,则应该能够按如下方式解决此问题:
不要 从按钮关闭对话框。
拥有拥有窗口关闭 事件处理程序的对话框 调用。然后拥有拥有对话框 显示兄弟对话框。
答案 3 :(得分:0)
Fredrik Mork's answer的扩展名,解决了结束表单可能是控制程序退出状态的形式。
private static void CloseAndShow(Form formToClose, Form formToShow)
{
Application.Run(formToShow);
formToClose.Close();
formToShow.Show();
}
Application.Run告诉程序在传递给它的表单关闭时退出
答案 4 :(得分:0)
我能找到方法的唯一方法是从静态方法调用我的对话框(使用单一模式的排序),然后使用静态变量标记何时需要重新打开Dialog。因此,当在静态方法内部结束对话框执行时,它会检查是否需要重新打开它。 否则我没有看到可行的方法。
答案 5 :(得分:0)
由于您似乎正在设置对话框的所有者,因此可以尝试在MyForm类的FormClosed()事件处理程序中使用owner.BeginInvoke()。 :
public partial class MyForm : Form
{
static int count = 0;
public MyForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.Close();
}
public static void ShowMyDialog(MyForm form, IWin32Window owner)
{
count++;
form.Text = "My ID: " + count;
form.ShowDialog(owner);
}
delegate void MyDel(MyForm form, IWin32Window owner);
private void MyForm_FormClosed(object sender, FormClosedEventArgs e)
{
MyDel del = ShowMyDialog;
MyForm mySecondForm = new MyForm();
this.Owner.BeginInvoke(del, mySecondForm, this.Owner);
}
}