1

我正在使用此处找到的说明来访问textboxes我的Winform. 出于某种原因,我得到了错误:

你调用的对象是空的

我很确定代码是正确的,但是一旦我尝试访问任何property控件,我就会收到该错误。我的代码如下 - 任何人都可以发现我做错了什么吗?

TextBox textbox = this.Controls["txtLiveBlock" + ((i + 1) * (j + 1)).ToString()] as TextBox;
textbox.Text = "TESTING";

请注意,我Textbox的名称为“txtLiveBlock1”,并且 i = 0,j = 0。我什至尝试将部分发送txtLiveBlock" + ((i + 1) * (j + 1)到 aMessageBox并得到“txtLiveBlock1”。

在此处输入图像描述

4

3 回答 3

1

分解它:

string name = "txtLiveBlock" + ((i + 1) * (j + 1)).ToString();
Control ctrl = this.Controls[name]; // returns null if the control is not found
TextBox textbox = ctrl as TextBox;  // returns null if ctrl is not a TextBox
textbox.Text = "TESTING";   // if textbox is null, throws NullReferenceException

单步执行此代码:它在哪里中断?

您在最后一行得到 a NullReferenceException,这意味着它textbox最终为空。这可能通过以下几种方式发生:

this.Controls[name]如果控件不在窗体上的控件列表中,则返回 null。请注意,其他控件内的控件不在此列表中 - 例如,面板中的控件在该面板的Controls列表中,而不是在表单的列表中。

ctrl as TextBoxctrl如果实际上不是 TextBox ,则返回 null 。

如果您单步执行代码并将鼠标悬停在变量上,您应该能够看到发生了什么。

于 2013-06-20T22:30:41.650 回答
1

如果控件位于另一个容器控件(如面板或 TabPage)内,则必须引用该容器控件:

TextBox textbox = tabPage1.Controls["txtLiveBlock" + ((i + 1) * (j + 1)).ToString()] as TextBox;
textbox.Text = "TESTING";
于 2013-06-20T22:54:15.777 回答
0

你在哪里调用这个代码?如果它在InitializeComponent()被调用之前位于构造函数中,那么此时 Controls 集合为空(尽管如果它为空,我希望 KeyNotFoundException 而不是返回空值,但我现在无法测试它) .

于 2013-06-20T22:29:52.837 回答