繁体   English   中英

你调用的对象是空的

[英]Object reference not set to an instance of an object

我具有创建运行时文本框的以下功能:

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

有什么建议吗?

您的问题是,在最新的TextBox上设置事件处理程序后, i将递增以指向数组中具有null值的位置(尚未为其构造TextBox )。

通常,您可以使用闭包来解决此问题,但是在这种特定情况下,事件系统会为您提供在其中按下了按键的TextBox ,并以银色拼盘形式提供:它是sender

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

addressBox [i]为null或addressBox [i]。文本为null。 在调试器中运行它以进行查找。

好吧,您在创建文本框后将i递增; 因此,是的,您应该得到一个对象引用错误。

考虑一下。

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

调用按键时,它将测试addressBox [1]。 这是空的。


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

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

有两种方法可以解决此问题。 首先是更改按键代码以将发件人转换为文本框并使用其文本功能。 就像是:

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

一种可选的方式,如果出于某种奇怪的原因,您想弹出一个消息框,显示在任何文本框中按下回车键时创建的最后一个文本框的文本,则可以使用:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM