2015-02-02 3 views
1

필자는 현재 약간의 피클을 사용하고 있으며, 4 개의 텍스트 상자를 생성하고 런타임에 테이블 레이아웃에 추가하는 코드를 만들었지 만 (아래 코드) 그것으로부터 텍스트를 얻는 데 어려움을 겪었으므로, string s = TxtBox1.Text.ToString();처럼 값을 얻으려고했으나 null 참조를 얻었습니다. 그러면 txt.Text.ToString();을 시도했는데 이것은 마지막으로 작성된 텍스트 상자에서 텍스트를 가져옵니다.동적으로 생성 된 텍스트 상자의 값 얻기

private void button2_Click(object sender, EventArgs e) 
    { 
     int counter; 
     for (counter = 1; counter <= 4; counter++) 
     { 
      // Output counter every fifth iteration 
      if (counter % 1 == 0) 
      { 
       AddNewTextBox(); 
      } 
     } 
    } 

    public void AddNewTextBox() 
    { 
     txt = new TextBox(); 
     tableLayoutPanel1.Controls.Add(txt); 
     txt.Name = "TxtBox" + this.cLeft.ToString(); 
     txt.Text = "TextBox " + this.cLeft.ToString(); 
     cLeft = cLeft + 1; 
    } 

나는 이것에 대한 답을 찾아 보았습니다. 아무도 아이디어가 있다면 감사드립니다.

감사

답변

5

이 코드는 tableLayoutPanel1에서 TextBox1에를 집어 들고는, 텍스트 박스 컨트롤에서 캐스팅 및 텍스트 속성을 취

string[] t = new string[4]; 
for(int i=0; i<4; i++) 
    t[i] = ((TextBox)tableLayoutPanel1.Controls["TxtBox"+(i+1).ToString()]).Text; 
: 당신이 텍스트 상자를 모두 필요로 다음 반복 경우

string s = ((TextBox)tableLayoutPanel1.Controls["TxtBox1"]).Text; 

+0

위대한 것들은 내가 캐스팅하지 않고 첫 번째 코드 블록을 얻으려고 노력한 몇 가지 것들과 너무 가깝습니다. 나는 웬일인지 내가 틀린 길을 가려고 결정했다 – Crouch

+0

@ Crouch, correct. 텍스트는 Control에서 상속됩니다. – ASh

2

시도해 볼 수 있습니다

var asTexts = tableLayoutPanel1.Controls 
      .OfType<TextBox>() 
      .Where(control => control.Name.StartsWith("TxtBox")) 
      .Select(control => control.Text); 

그 유형이 TextBox이고 이름이 "TxtBox"로 시작하는 tableLayoutPanel1의 모든 하위 컨트롤에 대한 Text 값이 열거됩니다. 필요에 따라 OfType 행 (TextBox가 아닌 컨트롤 제외) 또는 Where 행 (예제와 일치하는 컨트롤 만 허용) 필터를 완화 할 수 있습니다.

는 파일의 시작 부분에

Using System.Linq; 

을 가지고 있는지 확인합니다. 감사합니다, Daniele.

관련 문제