2010-12-23 3 views
1

Je cette fonction créer textbox d'exécution:référence d'objet non définie à une instance d'un objet

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); 
    } 
} 

mais j'ai référence d'objet non définie à une instance d'un objet ici

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

toute suggestion?

Répondre

0

Soit addressBox [i] est null ou addressBox [i] .Text est null. Exécutez-le dans le débogueur pour le savoir.

7

Votre problème est que après avoir réglé le gestionnaire d'événements sur votre dernier TextBox, i est incrémentée pour pointer vers une position dans votre tableau qui a une valeur null (pas TextBox a été construit pour encore).

Généralement, vous pouvez utiliser une fermeture pour résoudre ce problème, mais dans ce cas précis, le système d'événement vous donne le TextBox où la touche a été enfoncée servi dans un plateau d'argent: sender.

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

+1. Dommage, beaucoup ignorent aveuglément l'argument de l'expéditeur sur les gestionnaires d'événements :( –

+0

@Martinho: Je suppose que cela pourrait être commun chez les débutants, puisque sur la surface c'est juste un 'object'. – Jon

0

Eh bien, vous incrémentez i après avoir créé une zone de texte; oui, vous devriez avoir une erreur de référence d'objet.

Considérez ceci.

Vous entrez dans la fonction appendNewTab, i est 0
La fonction crée une zone de texte dans le tableau à addressBox [0] Ensuite, vous incrémenter immédiatement i à 1.

Quand est appelé keypress teste addressBox [1 ] Ce qui est nul.


Si vous avez appelé appendNewTab 100 fois, puis addressBox [0] à addressBox [99] aura des contrôles de zone de texte valides. Cependant, je serai mis à 100.

À quel point, vous devriez recevoir une exception hors limites de l'index lors de l'accès à addressBox [i].

Il y a deux façons de résoudre ce problème. La première consiste à modifier le code de la touche pour envoyer l'expéditeur dans une zone de texte et utiliser sa fonction de texte. Quelque chose comme:

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

Une façon optionnelle, si pour une raison bizarre que vous voulez faire apparaître une boîte de message indiquant le texte de la dernière zone de texte que vous avez créé quand ils pressés entrer dans une zone de texte vous pouvez utiliser:

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

Cependant, je ne pense vraiment pas que c'est le comportement que vous voulez.

Questions connexes