2013-07-04 42 views
0

你好我正在當我點擊添加按鈕話反而會使得使用該代碼的2個新的文本框有2個文本框和2個按鈕 的程序:C#獲取文本

 private void ADD_ROW_Click(object sender, EventArgs e) 
    { 
     //Make the NEW_TEXTBOX_1 
     HOW_FAR += 1; 
     TextBox NEW_TEXTBOX_1 = new TextBox(); 
     NEW_TEXTBOX_1.Name = "NAME_TEXTBOX_" + HOW_FAR.ToString(); 

     //Set NEW_TEXTBOX_1 font 
     NEW_TEXTBOX_1.Font = new Font("Segoe Print", 9); 
     NEW_TEXTBOX_1.Font = new Font(NEW_TEXTBOX_1.Font, FontStyle.Bold); 

     //Set pos and size and then create it. 
     NEW_TEXTBOX_1.Location = new System.Drawing.Point(16, 71 + (35 * HOW_FAR)); 
     NEW_TEXTBOX_1.Size = new System.Drawing.Size(178, 29); 
     this.Controls.Add(NEW_TEXTBOX_1); 


     //Make the PRICE_TEXTBOX_ 
     TextBox NEW_TEXTBOX_2 = new TextBox(); 
     NEW_TEXTBOX_2.Name = "PRICE_TEXTBOX_" + HOW_FAR.ToString(); 

     //Set NEW_TEXTBOX font 
     NEW_TEXTBOX_2.Font = new Font("Segoe Print", 9); 
     NEW_TEXTBOX_2.Font = new Font(NEW_TEXTBOX_2.Font, FontStyle.Bold); 

     //Set pos and size and then create it. 
     NEW_TEXTBOX_2.Location = new System.Drawing.Point(200, 71 + (35 * HOW_FAR)); 
     NEW_TEXTBOX_2.Size = new System.Drawing.Size(89, 29); 
     this.Controls.Add(NEW_TEXTBOX_2); 

     //Change pos of the add button 
     ADD_ROW.Location = new System.Drawing.Point(295, 71 + (35 * HOW_FAR)); 
     this.Height = 349 + (35 * HOW_FAR); 
     this.Width = 352; 
    } 

這工作得很好,但現在我想從新建立的文本框中獲取文本,我該如何做到這一點?

這不起作用,因爲它說:NAME_TEXTBOX_1在當前上下文中不存在。

private void button2_Click(object sender, EventArgs e) 
    { 
     string tmpStr = NAME_TEXTBOX_1.Text; 
    } 
+1

你可以遍歷'this.Controls'中的所有項目來找到你想要的名字。或者有一個單獨的'Dictionary ',您可以在其中保留對新創建的文本框的引用以方便訪問。 – Corak

回答

3

你需要移動的變量聲明ADD_ROW_Click事件處理程序之外,這樣它是塊外訪問;

TextBox NEW_TEXTBOX_1; 

private void ADD_ROW_Click(object sender, EventArgs e) 
{ 
    //Make the NEW_TEXTBOX_1 
    HOW_FAR += 1; 
    NEW_TEXTBOX_1 = new TextBox(); //remove "TextBox" since we declared it above 
    NEW_TEXTBOX_1.Name = "NAME_TEXTBOX_" + HOW_FAR.ToString(); 
    //... 

的替代方案,並可能更好地根據文本框的數量,是添加你創建成一個列表中的每個文本框。然後,您可以迭代該List並找到您想要的TextBox。例如

List<TextBox> allTextBoxes = new List<TextBox>(); 

private void ADD_ROW_Click(object sender, EventArgs e) 
{ 
    //Make the NEW_TEXTBOX_1 
    HOW_FAR += 1; 
    TextBox NEW_TEXTBOX_1 = new TextBox(); 
    //...fill out the properties 

    //add an identifier 
    NEW_TEXTBOX_1.Tag = 1; 

    allTextBoxes.Add(NEW_TEXTBOX_1); 
} 

然後當你想要一個特定的文本框

private void button2_Click(object sender, EventArgs e) 
{ 
    TextBox textBox1 = allTextBoxes.Where(x => x.Tag == 1).FirstOrDefault(); 
    string tmpStr = ""; 

    if(textBox1 != null) 
     tmpStr = textBox1.Text; 
} 

另外,特別是如果你將有很多的文本框,你可以將它們存儲在一個字典作爲Corak的建議評論。

+1

基本上這個,但我會使用'Dictionary '按名稱訪問。 – Corak

+0

好主意,一本詞典會工作得很好。 – keyboardP

0

一個簡單的解決方案: 例如,創建一個名爲「NEW_TB」的私有字段。 在你的button2_Click(..){string tmpStr = NEW_TB.Text; } 添加您的ADD_ROW_Click(..)方法NEW_TB = NAME_TEXTBOX_1;

如果我理解你的問題的權利,這應該工作。

3

你在ADD_ROW_Click方法中聲明瞭NAME_TEXTBOX_1,這就是它在button2_Cick方法中不可用的原因。

您可以在類級聲明文本框以在兩個位置訪問它。

(您應該也重新命名變量的工作 - 比如TextBoxPrice)

0

使全球您textboxes

TextBox NEW_TEXTBOX_1; 

然後在你的方法啓動它們:

NEW_TEXTBOX_1 = new TextBox(); 
+1

如果您想創建未知數量的文本框,則不是非常具有動態性。 – Corak

+1

@Corak然後一個'Textbox'類型的'list'會更好,但是這次根據給定的代碼它是一個很好的解決方案。 – Shaharyar

0

OMG沒關係對不起,我發現一個好方法:D

 var text = (TextBox)this.Controls.Find("PRICE_TEXTBOX_1", true)[0]; 
     text.Text = "PRO!"; 

這個作品相當不錯:)

+0

好的方法,但要小心訪問它的數組。如果沒有名爲「PRICE_TEXTBOX_1」的文本框,您將得到一個'IndexOutOfRangeException'。在設置Text屬性之前,檢查數組長度是否大於'0'。 – keyboardP