如何将UserControl添加到主窗体上的Panel?

时间:2016-06-05 14:38:07

标签: c# winforms user-controls

我正在研究项目winForm应用程序。我试图将UserControl添加到主窗体上的Panel。 这是我做的,我在主窗体上创建了一个公共静态方法,所以我可以从任何地方调用它而无需实例化主窗体。

public static void showUC(UserControl uc)
    {
        pnlContainer.Controls.Clear();
        GC.Collect();
        uc.Dock = DockStyle.Fill;
        pnlContainer.Controls.Add(uc);
    }

我收到编译错误“非静态字段,方法或属性需要对象引用”。

如果我将该方法创建为非静态,则编译错误将消失,但如果不创建主窗体的对象,我将无法调用它。

我想要实现的是能够在我的主窗体'frmMain'上的Panel'pnlContainer'中打开任何UserControl。

当主窗体加载时,我想调用方法而不再重新实例化主窗体。例如

public static void showUC(UserControl uc)
{
    pnlContainer.Controls.Clear();
    GC.Collect();
    uc.Dock = DockStyle.Fill;
    pnlContainer.Controls.Add(uc);
}

我想像这样调用这个方法

frmMain.showUC(new ucClientList);

来自另一个班级。

让我解释一下我想要实现的目标。 我有一个名为'frmMain'的表单控件,其中包含一个名为'pnlContainer'的面板控件,我想将UserControl加载到其中,我有UserControl1和UserControl2。 现在我运行程序并加载frmMain,我想将UserControl1添加到面板pnlContainer中,我在UserControl1中有一个按钮,当我点击它时,它应该将UserControl2加载到主窗体上的同一面板中。我该如何实现呢?

1 个答案:

答案 0 :(得分:0)

如果您真的想这样做,您可以编写如下代码:

public static void showUC(Control uc, Control pnlContainer)
{
    pnlContainer.Controls.Clear();
    uc.Dock = DockStyle.Fill;
    pnlContainer.Controls.Add(uc);
}

并将其称为:

showUC(new someControlType(), someControlContainer);

无需致电GC;请留待系统清理事宜!

static函数需要知道它应该使用的所有对象,所以你也需要传入容器。

最后new需要使用(可选)参数进行限制..

我制作了新控件Control的签名,以便您可以传入任何控件;为了更加灵活,容器也是Control。请注意,这仍然允许您传入表单!当然,你可能想回到更受限制的类型..

<强>更新

如果你想在同一个容器中的两个UserControls之间切换,你可以使用这个功能:

public static void showUC(Control uc)
{
    foreach (Control ctl in uc.Parent.Controls) ctl.Visible = ctl != uc;
}

它可以通过主叫的Parent访问另一个。在UC写道:

private void button1_Click(object sender, EventArgs e)
{
    Form1.showUC(this);
}

您可以修改以实际创建UserControls而不是Hiding/Showing他们;但你每次都会失去他们的状态..

如果这是您想要的,您可以考虑将名称更改为switchUcFromshowOtherUC;毕竟它并没有显示出这个&#39;而是隐藏这个并展示其他UC&#39;