从子窗体导航到其同级窗体
本文关键字:窗体 导航 | 更新日期: 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();
}
在基元级别上,使用标准的"向导"模式似乎比为每个问题使用单独的表单受益更多。例外的是,你不应该只有典型的下一步和后退按钮,而应该有跳到任何问题的按钮。这里有一个很好的教程,将引导您完成创建向导的正常步骤。