【问题标题】:Cannot reference dynamically referenced controls无法引用动态引用的控件
【发布时间】:2013-06-20 22:25:26
【问题描述】:

我正在使用找到的指令here 来访问我的Winform 中已经存在的几个textboxes。由于某种原因,我得到了错误:

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

我很确定代码是正确的,但是一旦我尝试访问控件的任何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) 发送到 MessageBox 并且我得到了“txtLiveBlock1”。

【问题讨论】:

  • 您确定控件实际上是一个文本框吗?我想如果没有找到具有给定名称的控件,索引器将抛出异常,因此很可能转换失败。我会直接转换为TextBox,而不是使用as 来查看它是什么。
  • 我通过GUI工具箱添加了控件。我很确定这是TextBox
  • 您的代码在哪个线程中运行?会不会是一些后台线程?
  • 确保 TextBox 不在另一个容器控件中,例如面板或组框。
  • 然后把this改成容器控件,如果是tab控件,就得有合适的TabPage控件。

标签: c# object dynamic reference


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    分解:

    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
    

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

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

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

    如果ctrl 实际上不是文本框,ctrl as TextBox 返回 null。

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

    【讨论】:

    • OK- 所以textbox 为空?检查ctrl 是否也为空。如果不是,请检查 ctrl 的类型 - 它不是 TextBox。
    • 我该怎么做?抱歉,我是初学者。
    • 我在问题中添加了一张图片。这不是说它是TextBox吗?
    • 看起来它您图片中的文本框。如果在单步执行代码时将鼠标悬停在变量上,您应该能够看到它的属性,或者如果它为 null,则为“null”。
    • 它确实是空的......很抱歉听起来像个白痴,但这是什么意思?
    【解决方案3】:

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

    【讨论】:

    • 所有这些控件创建完成后,由按钮触发。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多