Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个窗体中的多个用户控件之间导航_C#_.net_Winforms_User Controls - Fatal编程技术网

C# 在一个窗体中的多个用户控件之间导航

C# 在一个窗体中的多个用户控件之间导航,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,我有一个窗体和多个控件 假设我有一个表单,它应该包含一些控件 我尝试使用单个表单,并根据一些用例添加和删除控件 例如,这是我的表单类中的示例代码: private void AddToControlPanel(UserControl control) { this.panelControl.Controls.Add(control); this.panelControl.Tag = control; this

我有一个窗体和多个控件

假设我有一个表单,它应该包含一些控件

我尝试使用单个表单,并根据一些用例添加和删除控件

例如,这是我的表单类中的示例代码:

private void AddToControlPanel(UserControl control)
        {
            this.panelControl.Controls.Add(control);
            this.panelControl.Tag = control;
            this.panelControl.Size = control.Size;
            this.panelControl.Dock = DockStyle.Fill;
            control.Show();
        }
上面的示例将控件添加到某个面板并显示它

问题是我无法添加其他控件并删除当前控件。例如,如果某个登录控件成功进行身份验证,请删除登录控件本身,并像搜索框控件一样显示其他控件

如何才能做到这一点

这就是我迄今为止所尝试的:

if (LoginOK)
{
   //Add the next Control I want to load
   this.ParentForm.Controls.Add(new CtlPedirDevolucion());
   //Remove this actual control
   this.ParentForm.Controls.Remove(this);
}
。。。因此,稍后将使用事件处理程序显示最新添加的控件:

private void FirstForm_ControlRemoved(object sender, ControlEventArgs e)
{
    this.Controls[this.Controls.Count - 1].Show();
}
但这对我不起作用。此外,我不喜欢我的方法


你能给我一个更好的方法吗?

我也尝试过类似的方法,效果很好

表单中的代码:

public void SwitchControls(Control removeCtrl, Control addControl)
{
     panel1.Controls.Remove(removeCtrl);
     panel1.Controls.Add(addControl);
}
控制中的代码:

MyForm frm = (MyForm)this.FindForm();
CtlPedirDevolucion newCtrl = new CtlPedirDevolucion();
newCtrl.Dosck = DockStyle.Fill;
frm.SwitchControls(this, newCtrl);

编辑:我的错,在控件中创建将被删除的CTLPiderVolucion没有意义。它应该在您的表单中实例化,并且还应该有对它的引用。因此,SwitchControls应该有更复杂的逻辑,可能有更多的参数,但这是可以使用的。也许您可以制作一个开关盒或其他东西,在表单中创建一个控件。我提醒您,这只是一个有效但非常糟糕的示例。

您是否尝试过以先删除控件,然后添加新控件的方式切换这两个调用?或者您可以在表单中创建一个方法(您可以使用FindForm方法轻松找到该方法),用于切换作为参数传递的控件。mm这是怎么回事?我的意思是,我想到表单中的某个东西,它在关闭另一个控件后在表单中接收一个控件,这样就可以创建它,但我不知道怎么做。我将搜索有关FindForm()的内容调用Show()没有意义,当您将控件添加到父控件集合时,它将自动变为可见。所以,抓取你不喜欢的代码。只有一个错误,调用Remove()是一个非常严重的漏洞。您必须改用Dispose()。@HansPassant,但他可能想在代码中保留一些控件,然后将它们放回面板中,虽然这不是最好的方法,但我可以想象可能是这样。@Elviejo我编辑了您的问题,以便让其他人更好地理解您!