如何在关闭另一个时打开Winform对话框?

时间:2009-10-05 18:03:12

标签: c# winforms

我有一个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);
            }

        }

6 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,经过大量的故障排除后,我设法以完全不同的方式解决了这个问题:我首先等待Forms.Application.LeaveThreadModal事件发生,然后我等待下一个Forms.Application .Idle事件发生。到那时第一个对话框已经完全消失,因此可以毫无问题地启动第二个对话框。

仅等待空闲事件,或仅等待离开线程模式事件,或者以相反顺序等待这两个事件,将不起作用。

注意:只等待空闲事件APPEARS工作,但只有通过用鼠标单击第一个对话框的按钮才能激活第二个对话框。如果通过按键盘上该按钮的助记键来触发按钮,第二个对话框将出现在第一个对话框的上方!你必须完成我描述的序列才能避免这种情况!

在考虑了一点之后,在我看来,我的解决方案有点“神奇”,这意味着它可能会停止在未来的dotnet框架版本中工作,所以我想我会抛弃它并关注Mike Hoffer的建议,据我所知,这与jmayor给自己的答案基本相同,并标记为被接受。 (事实是Mike Hoffer的回答有点难以理解。)

答案 1 :(得分:0)

在不知道SiblingSiblingDialog类中的具体内容的情况下,确定可以。唯一的限制是,如果关闭作为应用程序主窗口的窗口,应用程序将退出。

例如,您可以提供类似的方法:

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);
    }
}