Winform multiple Usercontrols for different page under one Form

时间:2015-06-25 18:33:55

标签: c# winforms user-controls

I'm trying to build an Application UI using Winform for which will be having multiple pages inside it. Say software will be asking for a Login credentials on startup and then landing in a Dashboard. Then the user will have the option to go different pages like: Page1 - Page2 - Page3.

Now I'm planning to make one Form and all these pages will be separate UserControls. So as per requirement I will be changing the visibility of these UserControls.

Now to do this I'm putting the below code inside Form1.cs

  ControlLogin ucLogin = new ControlLogin();
  ucLogin.Location = new System.Drawing.Point(12, 67);
  this.Controls.Add(ucLogin);

This works fine. But while opening any UserControl from this ControlLogin.cs how will I add the new UserControl (say Page1Control) to the list of Form1?

2 个答案:

答案 0 :(得分:1)

您需要为您的网页开发一些交易逻辑。我建议您在主表单上使用面板作为容器使用。在此容器中,您将放置当前用户控件,即用户选择的控件。

例如:

internal void ReplaceUserPage(Control container, UserControl userRequest)
{
    if (container.Controls.Count == 1)
    {
        container.Controls.RemoveAt(0);
    }
    container.Controls.Add(userRequest);
    userRequest.Dock = DockStyle.Fill;
}

如果您没有动态页面,则可以将所有这些都设置为单例。这样,每个实例都将按需创建并存储在内存中,随时可以重用。因此,当用户点击菜单或按钮打开页面时,您可以执行

UserControl requested = Page1Control.GetInstance();
ReplaceUserPage(container, requested);

使用单身人士,您甚至不需要保留控件列表。我不是说这是最好或完美或一刀切的。有许多控制交易方法。这取决于系统复杂性和其他因素。

答案 1 :(得分:1)

您选择的基本布局对我来说很好。

您的实际问题似乎是:如何从这些UC中引用表单?

这与以下问题密切相关:如何从其他形式引用某种形式或部分形式?这里经常被问到这个问题。

以下是我建议你应该做的事情:

  1. 创建一个公开函数,用于打开每个联合国openLoginopenPageOne ..
  2. 更改每个UC的构造函数以包含Form1作为参数(假设您的表单具有默认名称)并相应地调用它:ControlLogin ucLogin = new ControlLogin(this);
  3. 在UCs构造函数中,您希望将传入的形式存储在类变量中。
  4. 在你写的表格中:

    public void openLogin(Form1 f)
    {
      ControlLogin ucLogin = new ControlLogin(this);
      ucLogin.Location = new System.Drawing.Point(12, 67);
      this.Controls.Add(ucLogin);
    }
    
    
    public void openPageOne(Form1 f)
    {
      ..
    }
    

    在UC(s)中:

    public ControlLogin(Form1 form1)
    {
        InitializeComponent();
        mainForm = form1;
    }
    
    Form1 mainForm = null;
    

    现在您可以引用表单中的所有公共字段和方法,也许就像这样

    if (logingIsOK) mainForm.openPageOne();