[英]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.