C# 对象引用未设置为对象的实例

C# 对象引用未设置为对象的实例,c#,.net,nullreferenceexception,C#,.net,Nullreferenceexception,我有一个创建运行时文本框的函数: 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++; } vo

我有一个创建运行时文本框的函数:

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

有什么建议吗?

地址框[i]为空或地址框[i]。文本为空。在调试器中运行它以查找。

地址框[i]为null或地址框[i]。文本为null。在调试器中运行它以找到答案。

您的问题是,在最新文本框上设置事件处理程序后,i会递增,以指向数组中具有空值的位置,但尚未为其构造文本框

通常,您可以使用闭包来解决此问题,但在这种特定情况下,事件系统会向您提供一个文本框,其中按键被放在一个银盘中:它是发送者


您的问题是,在最新文本框上设置事件处理程序后,i会递增,以指向数组中具有空值的位置,但尚未为其构造文本框

通常,您可以使用闭包来解决此问题,但在这种特定情况下,事件系统会向您提供一个文本框,其中按键被放在一个银盘中:它是发送者


在创建了一个文本框之后,您将增加i;所以,是的,您应该得到一个对象引用错误

想想这个

如果输入appendNewTab函数,i为0 该函数在addressBox[0]的数组中创建一个文本框 然后立即将i增加到1

当调用按键时,它会测试地址框[1]。这是空的

如果已调用appendNewTab 100次,则addressBox[0]到addressBox[99]将具有有效的textbox控件。但是,我将设置为100

在这一点上,当访问addressBox[i]时,您应该会收到索引越界异常

有两种方法可以解决这个问题。第一种是更改按键代码,将发送者转换为文本框,并使用其文本功能。比如:

MessageBox.Show((sender as TextBox).Text);
一种可选方式,如果出于某种奇怪的原因,您想弹出一个消息框,显示您在任何文本框中按enter键时创建的上一个文本框的文本,则您可以使用:

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

然而,我真的不认为这是你想要的行为。

好吧,你在创建一个文本框之后增加了I;所以,是的,您应该得到一个对象引用错误

想想这个

如果输入appendNewTab函数,i为0 该函数在addressBox[0]的数组中创建一个文本框 然后立即将i增加到1

当调用按键时,它会测试地址框[1]。这是空的

如果已调用appendNewTab 100次,则addressBox[0]到addressBox[99]将具有有效的textbox控件。但是,我将设置为100

在这一点上,当访问addressBox[i]时,您应该会收到索引越界异常

有两种方法可以解决这个问题。第一种是更改按键代码,将发送者转换为文本框,并使用其文本功能。比如:

MessageBox.Show((sender as TextBox).Text);
一种可选方式,如果出于某种奇怪的原因,您想弹出一个消息框,显示您在任何文本框中按enter键时创建的上一个文本框的文本,则您可以使用:

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

然而,我真的不认为这是你想要的行为。

+1。遗憾的是,许多人盲目地忽略了事件处理程序的发送者参数:@Martinho:我想这在初学者中可能很常见,因为表面上它只是一个对象。+1。遗憾的是,许多人盲目地忽略了事件处理程序的发送者参数:@Martinho:我想这在初学者中很常见,因为表面上它只是一个对象。