Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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#_Winforms - Fatal编程技术网

C# 面板中只有一种形式可见,以第一种形式为准

C# 面板中只有一种形式可见,以第一种形式为准,c#,winforms,C#,Winforms,我创建了两个表单(Message1和message2)和一个主表单。我正在根据主面板组合选择动态加载一个消息表单。主面板有一个带有两个选项(1和2)的组合框和一个空面板。 我对此进行了测试,但只有一个表单是可见的,无论哪个表单是先选择的 代码如下: private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { ComboBox cbox = (ComboBox)send

我创建了两个表单(Message1和message2)和一个主表单。我正在根据主面板组合选择动态加载一个消息表单。主面板有一个带有两个选项(1和2)的组合框和一个空面板。 我对此进行了测试,但只有一个表单是可见的,无论哪个表单是先选择的

代码如下:

 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            ComboBox cbox = (ComboBox)sender;
            if(cbox.SelectedIndex == 0)
            {
                Message1 objForm = new Message1();
                objForm.TopLevel = false;
                panel1.Controls.Add(objForm);
                objForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                objForm.Dock = DockStyle.Fill;
                objForm.Show();
                
            }
            else
            {

                if(cbox.SelectedIndex == 1)
                {
                    Message2 objForm = new Message2();
                    objForm.TopLevel = false;
                    panel1.Controls.Add(objForm);
                    objForm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                    objForm.Dock = DockStyle.Fill;
                    objForm.Show();

                }
            }
        }

我遗漏了什么?

好的,谢谢你的回答。clear()可以工作


处理以前的表单。在新建之前执行
panel1.Controls.Clear()
Add
@Sinatr
Clear()
不处理。谢谢Clear()不在面板上显示。我有200条这样的信息,你认为增加200条这样的表格好吗?我已在中更新了代码answer@jdweng
Show()
没有阻止任何内容。
TopLevel=false这些表单只是美化的用户控件。您应该移动
objForm1=newmessage1();objForm2=新消息2()
到窗体的构造函数,这样它们每次只创建一次,这将使
panel1.Controls.Clear()
正常工作。现在,您正在创建多个表单,而不必在每次更改组合框时都处理它们。正如LarsTech在注释中提到的,
.Controls.Clear()
不会处理您添加到该集合中的对象(无论这些对象是什么),它只是从集合中删除引用:原始对象仍然处于活动状态。如果每个对象中有多个对象,则向后循环并调用
Dispose()
。无论选择了什么,都要清除集合,因此只需执行一次即可。也可以构建工厂,因此只需传递要创建的对象类型。(表单而不是用户控件,IMO,错误的选择)。
public partial class MainPanel : Form
{
    Message1 objForm1;
    Message2 objForm2;
    public MainPanel()
    {
        InitializeComponent();
    }


    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        ComboBox cbox = (ComboBox)sender;
        objForm1 = new Message1();
        objForm2 = new Message2();
        if (cbox.SelectedIndex == 0)
        {
            panel1.Controls.Clear();
           
            objForm1.TopLevel = false;
            panel1.Controls.Add(objForm1);
            objForm1.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            objForm1.Dock = DockStyle.Fill;
            objForm1.Show();
            
        }
        else
        {

            if(cbox.SelectedIndex == 1)
            {

                panel1.Controls.Clear();

                objForm2.TopLevel = false;
                panel1.Controls.Add(objForm2);
                objForm2.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
                objForm2.Dock = DockStyle.Fill;
                objForm2.Show();

            }
        }
    }
}