我有30个左右的文本框,我按顺序标记{ex:R1C1B1,R1C2B1,R2C1B1,...}
这是我的代码:
private void Solve(int row, int column, int box)
{
string numbers = "123456789";
TextBox newTextBox = (TextBox)Controls.Find(string.Format("tbox{0}", "R" + row.ToString() + "C" + column.ToString() + "B" + box.ToString()), false).FirstOrDefault();
MessageBox.Show(newTextBox.Text);
if (newTextBox.Text != "")
{
return;
}
numbers = numbers.Replace(checkRow(row, column), "");
numbers = numbers.Replace(checkColumn(row, column), "");
numbers = numbers.Replace(checkBoxPos(row, column), "");
if (numbers.Length == 1)
{
newTextBox.Text = numbers;
}
}
每当我尝试使用MessageBox.Show查看文本框中的内容时,我会在标题中看到错误。以下是所有错误:
SudokuSolver.exe中出现未处理的“System.NullReferenceException”类型异常
附加信息:未将对象引用设置为对象的实例。
答案 0 :(得分:1)
在访问newTextBox
之前,您应该检查FirstOrDefault
是否为空。如果没有具有指定名称的文本框,则null
将返回var name = String.Format("tboxR{0}C{1}B{2}", row, column, box);
TextBox newTextBox = (TextBox)Controls.Find(name, false).FirstOrDefault();
if (newTextBox != null)
{
MessageBox.Show(newTextBox.Text);
//...
}
作为默认值:
newTextBox
请注意,如果null
为null.Text
,那么您无法获取该文字 - NullReferenceException
将为您提供var textBox = Controls.OfType<TextBox>().FirstOrDefault(tb => tb.Name == name);
。
顺便说一句,您可以使用LINQ搜索控件
{{1}}
答案 1 :(得分:1)
而不是newTextBox.Text != ""
使用newTextBox != null && newTextBox.Text != ""
答案 2 :(得分:0)
试试这样:
private void Solve(int row, int column, int box)
{
string numbers = "123456789";
TextBox newTextBox = (TextBox)Controls.Find(string.Format("tbox{0}", "R" + row.ToString() + "C" + column.ToString() + "B" + box.ToString()), false).FirstOrDefault();
if(newTextBox!=null)
{
MessageBox.Show(newTextBox.Text);
return;
}
numbers = numbers.Replace(checkRow(row, column), "");
numbers = numbers.Replace(checkColumn(row, column), "");
numbers = numbers.Replace(checkBoxPos(row, column), "");
if (numbers.Length == 1)
{
newTextBox.Text = numbers;
}
}
在使用之前,您需要检查newTextBox
的值。您需要检查newTextBox
中的值是否为null
。