在运行时添加textBox并保存更改

时间:2014-02-18 09:51:50

标签: c# .net winforms

我正在开发一个Windows窗体项目,需要用户通过单击按钮添加新字段(文本框和标签),我想要实现的目标。在用户添加新字段后,会自动创建文本框并将其保存到表单的设置中。这样当我再次运行我的项目时。新添加的文本框(来自运行时)可用。有没有可行的方法呢?我是c的新手#提前谢谢!

4 个答案:

答案 0 :(得分:3)

你试试这个

DataTable位于System.Data

using System.Data;

保存到xml

private void button1_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable("Settings"); //we use DataTable class

    dt.Columns.Add("ID");
    dt.Columns.Add("Control");
    dt.Columns.Add("ControlName");
    dt.Columns.Add("Top");
    dt.Columns.Add("Left");
    dt.Columns.Add("Width");
    dt.Columns.Add("Height");
    /*
     * You add more settings here
     */


    int id = 0;

    foreach (Control ctrl in this.Controls) //this.Controls is the parent control where the textbox is located
    {
        string c = ctrl.GetType().Name;
        switch (c)
        {
            case "TextBox":
                DataRow dr = dt.NewRow();
                dr["ID"] = id++;
                dr["Control"] = c;
                dr["ControlName"] = ctrl.Name;
                dr["Top"] = ctrl.Top;
                dr["Left"] = ctrl.Left;
                dr["Width"] = ctrl.Width;
                dr["Height"] = ctrl.Height;
                /*
                    * You add more settings here
                    */
                dt.Rows.Add(dr);
                break;
        }
    }

    dt.WriteXml(@"c:\TestFile.xml", XmlWriteMode.WriteSchema); //You can use save dialog to browse the location
}

要检索

private void button2_Click(object sender, EventArgs e)
{
    DataTable dt = new DataTable("Settings");

    dt.ReadXml(@"c:\TestFile.xml");

    foreach (DataRow dr in dt.Rows)
    {
        switch (dr["Control"].ToString())
        {
            case "TextBox":
                var t = new TextBox();
                t.Name = dr["ControlName"].ToString();
                t.Top = Convert.ToInt32(dr["Top"]);
                t.Left = Convert.ToInt32(dr["Left"]);
                t.Width = Convert.ToInt32(dr["Width"]);
                t.Height = Convert.ToInt32(dr["Height"]);

                this.Controls.Add(t);
                break;
        }
    }

}

答案 1 :(得分:1)

要实现这一点,您必须创建自己的结构以保存在设置或任何外部xml文件中。例如,您可以创建一个包含“name”和“text”字段的类,然后使用List listOfBoxes创建该类的通用列表,将其序列化为XML文件以便以后反序列化。

当你读取XML文件时,只需循环遍历列表并为每个项创建一个文本框和标签,指定名称和文本,在创建并添加到父容器控件后,我建议你使用flowlayout作为容器控制,或者你必须计算控件的de xy坐标

如果您不知道如何执行这些步骤,请问我。

使用文件或设置时,您也可以使用数据库表来存储控件数据

答案 2 :(得分:0)

....
btn.Click += new Event Handler(AddTextBox);
....

public void AddTextBox(Object o, EventArgs e) {
    TextBox newTextBox = new TextBox();
    newTextBox.Location = new Point(...);
    Controls.Add(newTextBox);
}

至于保存控件以备将来使用,您只需保存控件类型和位置即可。如前所述,这可以在数据库中完成,或者您可以选择xml或只是您自己格式的文本文件。

答案 3 :(得分:0)

之前我做过类似的事情。我使用了一个面板,代码就像:

private void panel1_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
      System.Windows.Forms.TextBox txtbox = new System.Windows.Forms.TextBox();
      txtbox.Location = e.Location;  //Creates the textbox where user double clicked
      panel1.Controls.Add(txtbox);
      txtbox.Focus();
      txtbox.Visible = true;
}

您可以在任意位置设置文本框的LeftTop。为了存储文本框,您必须创建一个表并存储每个文本框的详细信息(内容,位置等)。在稍后打开表单时,应从表中读取这些详细信息并创建这些文本框。 保存文本框:

foreach (Control c in panel1.Controls)
{
      if (c.GetType().Name == "TextBox")
      {
           //Save the texbox content,Leftposition,RightPosition,etc to database
      }
}

form_Load

private void MyForm_Load(object sender, EventArgs e)
{
     //Retrieve all textbox details from table as dataset.
     for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
     {
                System.Windows.Forms.TextBox txtbox = new System.Windows.Forms.TextBox();
                txtbox.Text = ds.Tables[0].Rows[i]["Content"].ToString();
                txtbox.Left = Convert.ToInt32(ds.Tables[0].Rows[i]["Left"].ToString());
                txtbox.Top = Convert.ToInt32(ds.Tables[0].Rows[i]["Top"].ToString());
                panel1.Controls.Add(txtbox);
                txtbox.Visible = true;
     }
}

您必须创建一个表格,如:

Content    Left    Top
NameA      100     100
NameB      132     241
NameC      242     311