在父表单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个表单引用的对象并不好。
我认为必须有某种方法来实现这种效果。有谁知道这个?
答案 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将引导您完成创建向导的常规步骤。