我正在开发一个Windows窗体项目,需要用户通过单击按钮添加新字段(文本框和标签),我想要实现的目标。在用户添加新字段后,会自动创建文本框并将其保存到表单的设置中。这样当我再次运行我的项目时。新添加的文本框(来自运行时)可用。有没有可行的方法呢?我是c的新手#提前谢谢!
答案 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;
}
您可以在任意位置设置文本框的Left
和Top
。为了存储文本框,您必须创建一个表并存储每个文本框的详细信息(内容,位置等)。在稍后打开表单时,应从表中读取这些详细信息并创建这些文本框。
保存文本框:
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