C# 使动态窗体控件永久化

C# 使动态窗体控件永久化,c#,winforms,C#,Winforms,我是一名MS Access程序员,正在转向C。在MsAccess中,我有一个例程,在设计视图中打开并创建一个新表单,然后该例程根据SqlServer表中的字段使用控件填充它。它不仅创建控件,还创建我使用的默认事件处理程序。这很节省时间 现在我尝试用C语言来实现这一点。我有一个例程,它动态创建控件,如下所示: MyTextBox=new System.Windows.Forms.TextBox(); this.Controls.Add(MyTextBox); 我的问题是控制不是永久性的。当我回到

我是一名MS Access程序员,正在转向C。在MsAccess中,我有一个例程,在设计视图中打开并创建一个新表单,然后该例程根据SqlServer表中的字段使用控件填充它。它不仅创建控件,还创建我使用的默认事件处理程序。这很节省时间

现在我尝试用C语言来实现这一点。我有一个例程,它动态创建控件,如下所示:

MyTextBox=new System.Windows.Forms.TextBox();
this.Controls.Add(MyTextBox);
我的问题是控制不是永久性的。当我回到表单设计时,没有动态创建的控件。有办法做到这一点吗

我想我最后的办法是让我的例程打开.CS源代码文件,并在其中写入几行C代码。但是如果有更简单的方法,我想知道。

对表单类进行子类化,并在其构造函数中创建和添加控件

然后,在向项目中添加新表单时,可以选择它作为模板

您的模板表单可能是:

public partial class TempleteForm : Form
{
    public TextBox MyTextBox;
    public TempleteForm()
    {
        MyTextBox = new System.Windows.Forms.TextBox();
        this.Controls.Add(MyTextBox);
    }
}
子类化Form类,并在其构造函数中创建和添加控件

然后,在向项目中添加新表单时,可以选择它作为模板

您的模板表单可能是:

public partial class TempleteForm : Form
{
    public TextBox MyTextBox;
    public TempleteForm()
    {
        MyTextBox = new System.Windows.Forms.TextBox();
        this.Controls.Add(MyTextBox);
    }
}

因此,基本上,您希望将向导指向一个数据源,并让它生成一个标准表单。 然后对其进行修改

这不是重复或运行时的事情,而是一次运行

您需要一个模板引擎,如T4或CodeSmith


从那里我们进入了意见领域,所以我闭嘴。

基本上,您希望向导指向一个数据源,让它生成一个标准表单。 然后对其进行修改

这不是重复或运行时的事情,而是一次运行

您需要一个模板引擎,如T4或CodeSmith


从那里我们进入了舆论领域,所以我要闭嘴。

不,无论如何也不容易。如果不实现设计时序列化系统并写入*.designer.cs文件,您在运行时更改的任何内容都不会反映在设计时。最简单的解决方案是将控件信息保存在XML或其他文件中,并在下一次应用程序运行时加载它,恢复控件。在编写构建表单的例程时,您可以手工构建表单。构建你的应用程序,不要编写代码来构建你的应用程序。这是浪费时间。请看这里:我有几十个表单要创建,其中一些有多达40个控件。每个控件至少有5个事件处理程序。我的MsAccess例程会在一秒钟内设置表单,然后我所要做的就是将控件拖动到正确的位置。Yak Swing不在其中。你可能使用了错误的项目模板,看起来你需要的是使用LightSwitch,而不是表单应用程序。看,我现在已经开始了。我编写了一个例程,将.Designer.cs文件中的每一行复制到表中的记录中。然后它将它们写回一个临时文件,在适当的地方插入新行,以便定义我的新字段。是的,这并不简单,但它在我学习的过程中教会了我C语言。所以我很喜欢做。不,反正不容易。如果不实现设计时序列化系统并写入*.designer.cs文件,您在运行时更改的任何内容都不会反映在设计时。最简单的解决方案是将控件信息保存在XML或其他文件中,并在下一次应用程序运行时加载它,恢复控件。在编写构建表单的例程时,您可以手工构建表单。构建你的应用程序,不要编写代码来构建你的应用程序。这是浪费时间。请看这里:我有几十个表单要创建,其中一些有多达40个控件。每个控件至少有5个事件处理程序。我的MsAccess例程会在一秒钟内设置表单,然后我所要做的就是将控件拖动到正确的位置。Yak Swing不在其中。你可能使用了错误的项目模板,看起来你需要的是使用LightSwitch,而不是表单应用程序。看,我现在已经开始了。我编写了一个例程,将.Designer.cs文件中的每一行复制到表中的记录中。然后它将它们写回一个临时文件,在适当的地方插入新行,以便定义我的新字段。是的,这并不简单,但它在我学习的过程中教会了我C语言。所以我很喜欢这样做。