2013-07-04 3 views
0

안녕하세요 제가 추가 버튼 다음이 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(); 
    //... 

텍스트 상자 수에 따라 대안으로, 작성한 각 TextBox를 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