2014-02-18 45 views
2

我正在開發一個Windows窗體項目,要求用戶通過單擊按鈕添加新字段(文本框和標籤),我想實現的是。用戶添加一個新字段後,會自動創建一個文本框並將其保存到我的表單的設置中。所以,當我再次運行我的項目。新添加的文本框(從運行時)可用。有沒有可能的方法來做到這一點?我是新來的C#提前致謝!在運行時添加文本框並保存更改

+6

的WinForms,WebForms的,WPF? –

+0

它看起來像你需要點擊事件創建文本框控件,填充它並添加到形式 – Grundy

+0

Windows從pls我需要這個爲我的項目 –

回答

3

你試試這個

數據表裏面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; 
     } 
    } 

} 
+0

添加一些錯誤陷阱,以防萬一。 :) – Jade

1

爲了實現這一點,您必須創建自己的結構以保存設置或任何外部xml文件。例如,您可以創建一個名爲「name」和「text」字段的類,然後使用List listOfBoxes創建該類的通用列表,並將其序列化爲XML文件以供後續反序列化。

當您閱讀XML文件時,只需遍歷列表併爲每個項目創建一個文本框和標籤,然後創建並添加到父容器控件之後,我建議您使用flowlayout作爲容器控制,或者你將不得不計算控制的xy座標

如果你不知道如何做任何這些步驟就問我。

使用文件或設置的insted的,你也可以使用一個DATABSE表來存儲數據控制

+0

感謝您的答覆!是的,請你可以告訴我如何使用XML文件做到這一點?並將控件存儲在數據庫中。謝謝! –

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或簡單的自己格式的文本文件。

+0

謝謝你的回覆。但我想保存文本框。所以當我再次運行我的應用程序時,從運行時創建的文本框是可用的。 –

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 
+0

我希望保存從運行時創建的文本框。所以當我再次運行我的項目。文本框被保存 –

+0

查看編輯答案 –

相關問題