从子表单导航到其兄弟表单

时间:2012-01-16 02:47:01

标签: c# winforms xaml

在父表单A中,有以下代码来调用子表单“B”:

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

以相同的形式:以下代码调用子表单“C”:

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

现在我想在表单B中创建一个按钮,这样如果我单击该按钮,它会自动导航到表单C.

如果可能的话,应该避免使用形式B中的表单C的引用对象,如同question的答案一样。原因是有超过十种形式,如B,C ......,每种形式都必须能够导航到另一种形式。在表单中有10个表单引用的对象并不好。

我认为必须有某种方法来实现这种效果。有谁知道这个?

3 个答案:

答案 0 :(得分:1)

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


查看此MSDN link;

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

在子表单中创建事件

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

答案 1 :(得分:1)

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

如果这是你想要的,你可以实现一个静态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);

答案 2 :(得分:0)

在原始级别,您似乎可以从使用标准“向导”模式中获益,而不是为每个问题分别使用表单。唯一的例外是,您应该使用按钮跳转到任何问题,而不是仅使用典型的下一个和后退按钮。 Here is a good tutorial将引导您完成创建向导的常规步骤。