2010-12-23 3 views
1

나는 런타임 텍스트 상자 생성이 기능이 있습니다개체 참조가 개체의 인스턴스로 설정되지 않았습니다

int i = 0; 
private TextBox[] addressBox = new TextBox[100]; 

private void appendNewTab() 
{ 
    addressBox[i] = new TextBox(); 
    addressBox[i].KeyPress += 
     new KeyPressEventHandler(this.addressBox_KeyPress); 
    i++; 
} 

void addressBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)13) 
    { 
     MessageBox.Show(addressBox[i].Text); 
    } 
} 

을하지만 난 개체 참조가 여기에 개체의 인스턴스

MessageBox.Show(addressBox[i].Text); 

로 설정하지 않은 어떠한 제안?

답변

0

addressBox [i]가 null이거나 addressBox [i] .Text가 null입니다. 찾으려면 디버거에서 실행하십시오.

7

귀하의 문제는 최근 TextBox에 이벤트 핸들러를 설정 한 후, i이 (더 TextBox 아직 그것을 위해 건설되지 않은)을 null 값을 갖는 배열의 위치를 ​​가리 키도록 증가한다는 것입니다.

일반적으로 클로저를 사용하여이 문제를 해결할 수 있지만이 경우 이벤트 시스템은 sender 인 키가 눌려진 TextBox을 제공합니다.

void addressBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (e.KeyChar == (char)13) 
    { 
     var textBox = (TextBox) sender; 
     MessageBox.Show(textBox.Text); 
    } 
} 
+2

+1. 동정, 그래서 많은 사람들이 맹목적으로 이벤트 처리기에서 발신자 인수를 무시 : ( –

+0

@ Martinho : 그것은 표면에 그냥'개체'이기 때문에 그것은 초보자들 사이에 공통 될 것 같아요. – Jon

0

글쎄, 당신은 텍스트 상자를 만든 후에 증가하고 있습니다. 그래서, 네, 객체 참조 에러를 얻어야합니다.

이것을 고려하십시오.

당신은 appendNewTab 함수를 입력 I [0] 그럼 즉시 증가 함수는 주소 상자에서 어레이 내의 텍스트 박스를 생성 0
인 I로 누르기가이 [1 주소 상자 테스트라고 1

]. 어느 쪽이 null인가.


appendNewTab을 100 번 호출 한 경우 addressBox [0]부터 addressBox [99]까지는 유효한 텍스트 상자 컨트롤을 갖습니다. 그러나 나는 100으로 설정 될 것입니다.

addressBox [i]에 액세스 할 때 어느 시점에서 인덱스를 벗어나는 예외를 받아야합니다.

이 문제를 해결하는 방법에는 두 가지가 있습니다. 첫 번째는 보낸 사람을 텍스트 상자로 캐스팅하고 텍스트 기능을 사용하기 위해 키 누르기 코드를 변경하는 것입니다. 뭔가 같은 : 몇 가지 이상한 이유로 그들이 어떤 텍스트 상자에 입력을 누를 때 만든 마지막으로 텍스트 상자의 텍스트를 표시하는 메시지 상자를 팝업하려는 경우

MessageBox.Show((sender as TextBox).Text); 

선택적인 방법은, 당신은 사용할 수 있습니다

MessageBox.Show(addressBox[i-1].Text); 

그러나 나는 그것이 당신이 원하는 행동이라고 생각하지 않습니다.

관련 문제