将字符串强制转换为文本框
本文关键字:文本 转换 字符串 | 更新日期: 2023-09-27 18:32:04
我正在尝试通过在表单中强制转换为与文本框名称等效的字符串来访问表单中的文本框,但出现错误,指出"对象引用未设置为对象的实例"
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);
}
// }
// }
}
Control.ControlCollection.Find Method
TextBox t = this.Controls.Find(textboxname, true).FirstOrDefault() as TextBox;
这是因为this.Controls
只返回当前控件的直接子级。如果文本框位于面板中,则this.Controls
(假设this
是表单)将找不到该文本框。你需要做这样的事情:
(此答案的修改版本)
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");
这可能有助于您创建文本框数组。
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;
}
您还可以像这样获取所有文本框控件
foreach (Control x in this.Controls)
{
if (x is TextBox)
{
((TextBox)x).Text = "Whatever you wanted here";
}
}
您是否在单独的线程中访问文本框?试试这个:
this.Invoke((MethodInvoker)delegate() { this.Controls["Textbox00"] = "YourVal"; });
希望有帮助。
我建议使用递归函数在所有控件及其子控件中搜索您需要的控件:
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
}