C# 从另一个窗体加载面板

C# 从另一个窗体加载面板,c#,winforms,C#,Winforms,我创建了两个表单,表单1带有面板,表单2带有面板。在Form2上,我想设计控件,然后在Form1中动态加载这些控件。我的想法是,我可以使用VS设计任意数量的表单,但是可以使用表单中的面板动态加载到Form1中 问题是,form2使用Dataset+Databind,当加载到Form1中时,它就会停止工作 我在Form1中尝试的方法: From2 from2 = new Form2(); for (int i = 0; i < cf.Form2.Contro

我创建了两个表单,表单1带有面板,表单2带有面板。在Form2上,我想设计控件,然后在Form1中动态加载这些控件。我的想法是,我可以使用VS设计任意数量的表单,但是可以使用表单中的面板动态加载到Form1中

问题是,form2使用Dataset+Databind,当加载到Form1中时,它就会停止工作

我在Form1中尝试的方法:

        From2 from2 = new Form2();

        for (int i = 0; i < cf.Form2.Controls.Count; i++)
        {
            panel1.Controls.Add(cf.Form2.Controls[i]);
        }
From2 From2=newform2();
for(int i=0;i
这是假设我准确地理解了你的意思

正如你所发现的,这种方法是不可行的

一个更好的方法是创建一个包含面板的。在用户控件中,可以公开一个名为DataBind()的公共方法,该方法将数据源作为输入参数,并在该方法中绑定数据

动态加载用户控件比动态加载表单更容易

在用户控件中,只需添加一个方法即可。(根据需要对此进行修改以满足您的需要)

在您的表单中,您可以这样称呼它(当然,应该有错误处理,等等-这是一个如何完成我所描述的任务的简单示例)


我不确定我是否100%理解你说的话,如果我错了,请纠正我。是否要从各种表单加载子项并在form1上动态显示它们?我不知道你为什么要这么做

为什么不使用用户控件呢?您可以根据需要创建不同的用户控件,并根据需要将这些控件加载到表单1中


如果您不确定如何执行此操作,请右键单击您的项目>添加新项目>用户控件,然后进行操作。

正如其他答案所述,您需要使用的解决方案是为这些类型的情况创建用户控件。您尝试执行的操作不起作用的原因是控件专门设计为只在单个窗体上工作。如果尝试将控件添加到多个窗体,则只能将其成功添加到一个窗体。这甚至适用于用户控件。您不能只创建一个usercontrol,然后将其添加到两个表单中。用户控件的优点是,您可以将用于创建、初始化和使用部分功能的所有代码放置在表单的单独位置。您需要为添加两个单独窗体的同一用户控件创建两个单独的实例。优点很简单,创建面板的代码以及其中的所有内容或与之相关的所有内容都可以重复使用。

这样的想法是,其他人可以使用面板控件设计form2,并且该人可以根据自己的意愿进行更改,而无需我在每次更改设计时都更新代码。另一个原因是,我本可以使用TabPanel,但程序布局中会出现过多的选项卡,因此我想到在主窗体1中的一个面板中动态添加控件。但是,在他们自己的表单中,设计其他表单变得更容易。我从来没有简化过用户控件,谢谢,我会研究它。好的,我加载了用户控件,但不确定如何添加数据绑定(),它不必是call DataBind()。它可以是你想要的任何东西。您只需向UserControl添加一个函数并将其标记为public。然后,从放置用户控件的实际表单,可以调用它。我将用一些伪代码修改我的答案。我假设这是winforms,并相应地标记了它。如果没有,请修复标记以包含实际范例。
public void BindData(System.Data.DataTable t)
{
   GridView1.DataSource = t;
   if(t.Rows.Count > 0)
   {
      FirstNameTextBox.Text = Convert.ToString(t.Rows[0]["FirstName"])
   }
}
System.Data.DataTable t = new System.Data.DataTable;
System.Data.SqlClient.SqlDataAdapter ad = new System.Data.DataAdapter(sql, connectionstring);
ad.Fill(t);

MyUserControl myControl= new MyUserControl();
myControl.BindData(t);