你调用的对象是空的

时间:2010-12-23 19:40:36

标签: 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++;
}

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

但是我没有将Object引用设置为对象的实例

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

任何建议?

3 个答案:

答案 0 :(得分:7)

您的问题是,在最新TextBox上设置事件处理程序后,i会增加指向数组中具有null值的位置(无{{1}已经为它构建了。)

通常情况下,您可以使用闭包来解决此问题,但在此特定情况下,事件系统会为您提供TextBox,其中按键在银盘中按下:TextBox。< / p>

sender

答案 1 :(得分:0)

addressBox [i]为null或addressBox [i] .Text为null。在调试器中运行它以查找。

答案 2 :(得分:0)

嗯,你在创建一个文本框后正在递增;所以,是的,你应该得到一个对象引用错误。

考虑一下。

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

当调用keypress时,它会测试addressBox [1]。哪个是空的。


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

在访问addressBox [i]时,您应该收到索引超出范围的异常。

有两种方法可以解决这个问题。第一种是更改按键代码以将发送者强制转换为文本框并使用它的文本功能。类似的东西:

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

一种可选方式,如果出于某种奇怪的原因,您想要弹出一个消息框,显示您在按任何文本框时输入时创建的最后一个文本框的文本,那么您可以使用:

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

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