2013-06-05 4 views
1

Button3을 클릭하면 새로운 TextBox를 만드는 프로그램을 작성하고 싶습니다. 어떤 이유로 C#이 txtRun을 인식하지 못합니다. txtRun이라는 이름이 현재 컨텍스트에 존재하지 않는다고합니다. 여기 내 코드 :버튼을 클릭 한 후 새 텍스트 상자를 만드는 방법은 무엇입니까?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      textBox1.Text += "a"; 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      textBox1.Text += "b"; 
     } 

     private void textBox1_TextChanged(object sender, EventArgs e) 
     { 

     } 

     private void button3_Click(object sender, EventArgs e) 
     { 

      txtRun = new TextBox(); 
      txtRun.Name = "txtDynamic"; 
      txtRun.Location = new System.Drawing.Point(20, 18); 
      txtRun.Size = new System.Drawing.Size(200, 25); 
      // Add the textbox control to the form's control collection   
       this.Controls.Add(txtRun); 
     } 

     } 



     } 
    } 
} 
+0

또한 각 새 TextBox에 ** Location() **을 부여해야합니다. 그렇지 않으면 button3을 클릭 할 때마다 새 TextBox가 이전 텍스트 상자 위에 놓이게되고 큰 텍스트 스택. –

+0

FlowLayoutPanel 또는 TableLayoutPanel과 같은 것을 사용하여 다른 위치를 할당하는 것이 좋습니다. 매우 귀찮은 작업이 될 수 있고 특히 그리드 형식과 같은 그리드에서 원하는 경우 시간 낭비가 될 수 있습니다. – CodeCamper

답변

3

변수를 사용하기 전에 C#에서 선언해야합니다.

사용 중

TextBox txtRun = new TextBox(); 

또는 implicitly typed 변수를 사용

var txtRun = new TextBox(); 
2

어쩌면 문제가 그렇지 답변 주어 찾고뿐만 아니라 유형

var txtRun = new TextBox(); 
0

을 선언한다 당신이 제공 한 코드에서, 너무 많은 닫는 중괄호가있는 것처럼 보입니다. 더 구체적으로 마지막 두 가지 - 당신은 그것들을 필요로하지 않습니다.

0

질문 : txtRun를 인식하지 못하는 몇 가지 이유 C 번호

. txtRun이라는 이름이 현재 컨텍스트에 존재하지 않는다고합니다.

답변 : 변수 txtRun을 만든하지만 그것을 유형을 지정하지 않은 명세서

txtRun = new TextBox(); 

에서

. 그냥 같은 당신은 문자열을 만들거나 INT의 텍스트 상자는 또한 VAR와 단어 텍스트 상자를 대체 할 수있는 등

TextBox txtRun = new TextBox(); 

로 txtRun하기 전에 클래스 텍스트 상자의 이름을 사용하고 당신을 위해 컴파일러 추측을하게한다 예외없는 경우 .

이렇게하면 곧바로 해결 될 것입니다.

그러나 실제 문제는 사용자가 단추를 무한 횟수 클릭하면 무한한 수의 텍스트 상자를 만드는 것입니다. 또한 깨닫지 못할 수도 있지만 버튼을 두 번째로 누르면 TextBox가 원본 아래에 놓이게되므로 입력 한 텍스트가 그대로 남아 있기 때문에 깨닫지 못할 수도 있지만 TextBoxes를 많이 만들었습니다. 좋지 않다. 나는 정확히 몇 가지 방법으로 접근 할 수있는 시나리오에 따라 무엇을 성취하고 있는지 확신 할 수 없습니다.

시나리오 1 (당신은 단지 1 동적으로 생성 된 텍스트 상자를 원하는)

그것은 단지 하나를 만드는 있도록 텍스트 상자가 이미 생성되었는지 확인하기위한 변수를 만듭니다. * 실제로는 클릭 메서드의 외부에서 TextBox를 만들거나 호출해야합니다. 왜냐하면이 메서드의 범위를 잃어 버리기 때문입니다.

시나리오 2는 FlowLayoutPanel 또는 TableLayoutPanel과 같은 무언가를 사용하여 동적으로 생성 된 텍스트 상자 을 추적하는 것은 쉬운 일이다

가 텍스트 상자 목록 또는 배열을 생성 (동적 1 개 이상의 텍스트 상자를 만들려면) 특히 그리드와 같은 것을 만들고 싶거나 새 TextBox마다 고유 한 위치를 보장하려는 경우 TextBox 배치를 처리해야합니다. * 클릭 메서드의 외부에서 TextBox를 실제로 만들거나 호출해야하는 이유는이 메서드의 범위를 잃어 버리기 때문입니다.

필요한 경우 알려 주시면 사례에 대해 자세히 설명 드리겠습니다.

0

var txtRun = new TextBox(); 
    txtRun.Name = "txtDynamicTemp"; 
    txtRun.Location = new System.Drawing.Point(20, 18); 
    txtRun.Size = new System.Drawing.Size(200, 25); 
    // Add the textbox control to the form's control collection   
     this.Controls.Add(txtRun) 

으로 시도;

관련 문제