我试图通过在我的表单中转换一个等效于文本框名称的字符串来访问我的表单中的文本框但是我收到错误,指出“对象引用未设置为对象的实例”
private void writetotexboxarray()
{
// for (int i = 0; i < 9; i++)
//{
//for (int j = 0; j < 4; j++)
//{
textboxname= "Textbox" + 0 + 0;
MessageBox.Show(textboxname);
TextBox t = new TextBox();
t = (TextBox)(this.Controls[textboxname]);
//readintakedata[0,0].Text = t.Text;
try
{
string value = t.Text;
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
// }
// }
}
答案 0 :(得分:2)
Control.ControlCollection.Find Method
TextBox t = this.Controls.Find(textboxname, true).FirstOrDefault() as TextBox;
答案 1 :(得分:1)
因为this.Controls
只返回当前控件的直接子项。如果文本框位于面板中,则this.Controls
(假设this
为表单)将不找到文本框。你需要做这样的事情:
(this answer的修改版本)
public IEnumerable<Control> GetAll(Control control)
{
var controls = control.Controls.Cast<Control>();
return controls.SelectMany(ctrl => GetAll(ctrl)).Concat(controls);
}
然后你会写:
var t = GetAll(this).OfType<TextBox>().FirstOrDefault(c => c.Name == "Textbox00");
答案 2 :(得分:0)
这可能会帮助您创建TextBox数组。
var arr = new TextBox[10];
for (var i = 0; i < 10; i++)
{
var tbox = new TextBox();
tbox.Text = i.ToString();
// Other properties sets for tbox
this.Controls.Add(tbox);
arr[i] = tbox;
}
你也可以像这样获得所有的TextBox控件
foreach (Control x in this.Controls)
{
if (x is TextBox)
{
((TextBox)x).Text = "Whatever you wanted here";
}
}
答案 3 :(得分:0)
您是否在单独的线程中访问文本框? 试试这个:
this.Invoke((MethodInvoker)delegate() { this.Controls["Textbox00"] = "YourVal"; });
希望有所帮助。
答案 4 :(得分:0)
我建议使用递归函数来搜索所需的控件及其子控件:
private TextBox GetTextBoxByName(string name)
{
foreach (Control control in Controls)
{
if (control.Name == name)
{
if (control is TextBox)
{
return (TextBox)control;
}
else
{
return null;
}
}
if (control.HasChildren)
{
return GetTextBoxByName(name);
}
}
return null;
}
然后,你可以这样做:
TextBox t = GetTextBoxByName(textboxname);
if (t != null)
{
string value = t.Text;
// do stuff
}