从子窗体导航到其同级窗体

本文关键字:窗体 导航 | 更新日期: 2023-09-27 18:20:19

在父窗体a中,有以下代码来调用子窗体"B":

        Window frmChildB;
        frmChildB = new FormB();
        frmChildB.ShowDialog();

在相同的形式中:以下代码调用子形式"C":

        Window frmChildC;
        frmChildC = new FormC();
        frmChildC.ShowDialog();

现在我想在表格B中制作一个按钮,这样,如果我点击该按钮,它就会自动导航到表格C。

如果可能的话,应该避免像在这个问题的答案中那样在形式B中使用形式C的参考对象。原因是有十多种形式,如B、C……它们中的每一种都必须能够导航到另一种。在一个表单中包含10个表单引用的对象是不好的。

我认为一定有办法达到这个效果。有人知道这件事吗?

从子窗体导航到其同级窗体

如果我正确理解你的问题,你希望每个表单都有一个实例,并在它们之间来回导航。

如果这是您想要的,您可以实现一个静态FormManager类,该类创建表单的实例并根据需要显示它们。您甚至可以使用枚举来进一步降低复杂性。

下面是这个类的一个例子(它需要一些额外的工作,但应该会给你一个好主意):

public class FormManager
{
    private static FormB m_FormB;
    public static FormB formB
    {
        get
        {
            if (m_FormB == null)
            {
                m_FormB = new FormB();
            }
            return m_FormB;
        }
    }
    private static FormC m_FormC;
    puClic static FormC formC
    {
        get
        {
            if (m_FormC == null)
            {
                m_FormC = new FormC();
            }
            return m_FormC;
        }
    }
    public enum FormId
    {
        FormB,
        FormC
    }
    public static Form ShowForm(FormId whichForm)
    {
        Form oForm;
        switch (whichForm)
        {
            case FormId.FormB:
                oForm = FormManager.formB;
                break;
            case FormId.FormC:
                oForm = FormManager.formC;
                break;
            default:
                oForm = null;
                break;
        }
        if (oForm != null)
        {
            oForm.ShowDialog();
        }
        return oForm;
    }
}

这可以从子窗体调用为:

FormManager.ShowForm(FormManager.FormId.FormB);

尝试在frmChildB中创建一个事件并在Parent中订阅它。然后,您可以在不引用frmChildB中的frmChildC的情况下执行您想要的操作。


看看这个MSDN链接;

这是非常粗糙的,但应该会给你一个想法。

在子窗体中创建事件

public delegate void SwapEventHandler(object sender, EventArgs e);
public partial class Form2 : Form
{
    public event SwapEventHandler Swap;
    public Form2()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Swap(sender, e);
    }
}

在父窗体中消费

private void button1_Click(object sender, EventArgs e)
{
    frmChildB = new Form2();
    frmChildB.Name = "frmChildB";
    frmChildB.Swap += new SwapEventHandler(frmChildB_Swap);
    frmChildB.ShowDialog();
}

private void frmChildB_Swap(object sender, EventArgs e)
{
    frmChildB.Swap -= new SwapEventHandler(frmChildB_Swap);
    frmChildB.Close();
    frmChildB.Dispose();
    frmChildB = null;
    frmChildC = new Form2();
    frmChildC.Name = "frmChildC";
    frmChildC.Swap += new SwapEventHandler(frmChildC_Swap);
    frmChildC.ShowDialog();
}
void frmChildC_Swap(object sender, EventArgs e)
{
    frmChildC.Swap -= new SwapEventHandler(frmChildC_Swap);
    frmChildC.Close();
    frmChildC.Dispose();
    frmChildC = null;
    frmChildB = new Form2();
    frmChildB.Name = "frmChildC";
    frmChildB.Swap += new SwapEventHandler(frmChildB_Swap);
    frmChildB.ShowDialog();
}

在基元级别上,使用标准的"向导"模式似乎比为每个问题使用单独的表单受益更多。例外的是,你不应该只有典型的下一步和后退按钮,而应该有跳到任何问题的按钮。这里有一个很好的教程,将引导您完成创建向导的正常步骤。