Windows表单C#按代码更改用户控件

Dea*_*ger 5 c# user-controls winforms

我有一个窗体,我不想让任何其他窗体形式只是一个窗体和不同的用户控制如何在用户控件之间进行更改,例如隐藏一个并以编程方式显示其他用户控件?


private void Btt_info_Click(object sender, EventArgs e)
{
    Frm_Main frm_main = new Frm_Main();
    frm_main.Controls["panel1"].Controls.Clear();
    UC_Info uc_info = new UC_Info();
    frm_main.Controls["panel1"].Controls.Add(uc_info);
}
Run Code Online (Sandbox Code Playgroud)

我添加了这个,但它不起作用

Mik*_* C. 13

添加容器控件(如果我没记错的话,工具箱中有容器部分?),就像面板一样.为您想要动态切换的内容创建用户控件.因此,请像'HomePage'用户控件和'LoginPage'用户控件.动态添加要显示的用户控件到容器.如果需要,将其从容器中删除并添加其他用户控件:

Panel myPanel = new Panel();
LoginPage ctlLoginPage = new LoginPage();
HomePage ctlHomePage = new HomePage();

//add the loginpage to the panel first
myPanel.Controls.Add(ctlLoginPage);

...do stuff...

//remove whatever control is currently in the Panel
myPanel.Controls.Clear();
//add the other control, the HomePage control instead now
myPanel.Controls.Add(ctlHomePage);

..do other stuff...
Run Code Online (Sandbox Code Playgroud)

我通常这样做,所以你将表单本身打开以添加可能在不同"页面"之间共享的常用控件和内容.

编辑:请注意,我通常会在设计器中添加面板,而不是在代码中动态创建它.这只是一个例子.

编辑:你的mainform和usercontrols之间的交互可以用几种不同的方式处理,我并不是说这些都是正确的方法.

  • 您可以在Mainform上为Panel创建静态属性,这样您就可以随时访问它以交换控件.

在这个例子中,我还将为它添加一个静态方法

enum PanelControlsEnum {HomePage, LoginPage};
public static Panel MyContainerPanel {get;set;}
public static void SwitchPanelControls(PanelControlsEnum selControl){
  ..put your switch panels code here..
}
Run Code Online (Sandbox Code Playgroud)

然后在你的usercontrol中调用一个预定义的方法,例如:

MainForm.SwitchPanelControls(PanelControlsEnum.HomePage);
Run Code Online (Sandbox Code Playgroud)
  • 另一种方法是在主窗体上而不是在窗体内绑定按钮单击事件.

像这样:

HomePage ctlHomePage = new HomePage();
ctlHomePage.Click += MyClickEvent;
myPanel.Controls.Add(ctlHomePage)
Run Code Online (Sandbox Code Playgroud)

...

private void MyClickEvent(object sender, RoutedEventArgs e)
{
  ..switch user control code here...
}
Run Code Online (Sandbox Code Playgroud)