无法使用手动创建的TextBox控件中的Text属性

时间:2014-08-20 18:38:46

标签: c# winforms textbox

我无法显示使用代码创建的Text TextBox属性。我使用TextBox newTextBox = new TextBox()创建了文本框,但MessageBox(newTextBox.Text)给出了错误。

以下是我谈到的代码:

var name = String.Format("R{0}C{1}B{2}", row, column, box); 
TextBox newTextBox = (TextBox)Controls.Find(name, true).FirstOrDefault();      
MessageBox.Show(newTextBox.Text); 

P.S。我有名为R1C1B1的文本框,`R1C2B1``等等!


错误讯息:

An unhandled exception of type 'System.NullReferenceException' occurred in SudokuSolver.exe

Additional information: Object reference not set to an instance of an object.

2 个答案:

答案 0 :(得分:1)

我怀疑您的Textbox实际上在其他容器中,例如Panel

尝试使用递归方法找到您的控件:

public static Control FindTargetTextbox(Control control, string targetName)
{
    foreach (Control child in control.Controls)
    {
        if (child is TextBox && child.Name == targetName)
        {
            return child;
        }
    }

    foreach (Control child in control.Controls)
    {
        Control target = FindTargetComponent(child);

        if (target != null)
        {
            return target;
        }
    }

    return null;
}

请记住,您的表单是最大的容器,因此您应该将其作为起点传递:

TextBox textBox = FindTargetTextbox(this, name);

修改 正如@mikeng在评论中提到的那样,我们可以将两个foreach合并为一个这样的:

public static Control FindTargetTextbox(Control control, string targetName)
{
    foreach (Control child in control.Controls)
    {
        if (child is TextBox && child.Name == targetName)
        {
            return child;
        }

        Control target = FindTargetComponent(child);

        if (target != null)
        {
            return target;
        }
    }

    return null;
}

这确实是另一种有效的方法,但应根据实际情况选择最合适的方法:

第一种方法探索同一容器中的所有控件,然后深入到该容器的子控件,这是广度优先搜索,而第二种方法专注于嵌套控件逐个,即只有在完成当前容器中所有控件的处理后才会进入下一个容器,这是深度优先搜索

答案 1 :(得分:0)

正如我所说的那样是正确的

1)不是具有指定名称的文本框 2)有一个文本框但它在容器内

在任何情况下,使用此代码查找表单上存在哪些控件,然后从正确的容器中调用Find方法

foreach (Control item in this.Controls)
{
            if (item is TextBox)
                Console.WriteLine("TextBox:" + item.Name);
            else
                Console.WriteLine(item.GetType().Name + ":" + item.Name);

}