我有这个数组,其中包含类和值类型的每个属性的名称......
public string[,] test = new string[,]
{
{ "s", "ID", "textBox" },
{ "s", "Status", "" },
{ "s", "User", "" },
{ "s", "JobTitle", "textBox" },
{ "s", "Number", "textBox" },
{ "s", "Club", "" },
因为我的表单中的每个文本框都以“txt”开头,所以我可以动态地拥有所有文本框名称。
for (int i = 0; i < (mobile.test.Length / 3); i++)
{
if (mobile.test[i, 2] == "textBox")
{
TextBox tb = new TextBox();
string textBoxName = "txt" + mobile.test[i, 1];
我可以通过动态反射获得我的classe属性值,如:
var type = mobile.GetType();
var property = type
.GetProperty(mobile.test[i, 1])
.GetValue(mobile);
所以我的目标是用类属性值填充所有文本框,但我似乎无法找到如何...我尝试过这样的东西,但我无法将文本框名称转换为对象
object obj = tb
.GetType()
.GetProperty("Name")
.SetValue(tb, textBoxName); --> this doens't work
obj
.GetType()
.GetProperty("Text")
.SetValue(obj, Convert.ToString(property), null);
但这不起作用...... :(
UPDATE1:
好的,我得到了这样的工作:
string textBoxName = "txt" + mobile.test[i, 1];
object[] tb = this.Controls.Find(textBoxName, true);
object obj = tb[0];
Type mobileType = mobile.GetType();
var property = mobileType.GetProperty(mobile.test[i, 1]).GetValue(mobile);
obj.GetType().GetProperty("Text").SetValue(obj, Convert.ToString(property), null);
虽然它有效但我想知道它是否是最好的方式......?谢谢
答案 0 :(得分:0)
由于这是一个WinForms应用程序,因此您可以访问表单的Controls集合。与上面的代码示例保持一致,你可以得到像这样的实际TextBox。
var tb = this.Controls.OfType<TextBox>().FirstOrDefault(x => x.Name.Equals(textBoxName, StringComparison.InvariantCultureIgnoreCase));
if (tb != null)
{
tb.Text = property;
}
在此示例中,property是您在此处检索的值:
var type = mobile.GetType();
var property = type
.GetProperty(mobile.test[i, 1])
.GetValue(mobile);
我希望这会有所帮助。
答案 1 :(得分:0)
我认为你的反思太过分了。如果您知道控件的位置,请使用该控件上的Controls
集合并获取文本框。
foreach(var tb in parentControl.Controls.Where(c => c is TextBox))
tb.Text = propVals[i++];
其中propVals
是您正在检索的值的集合。 i
是一个int
计数器,用于枚举集合。
另外,我假设你想要文本集,因为你谈到了视觉上的看法。但是,您的代码让我相信您要设置文本框名称(这不是可视的)。如果您的代码准确无误,那么您只需改为tb.Name = propVals[i++];
。
或者,如果您有多个文本框并且实际上是以名称命名,那么请.Where(c => c.Name.StartsWith("txt")
最后,关于parentControl.Controls
的说明 - 它不是递归的,因此它不会进入子面板等。
编辑: 我现在可能会更好地理解这一点,但如果我没有道歉,我会道歉。
Type mobileType = mobile.GetType();
foreach(var tb in parentControl.Controls.Where(c => c is TextBox))
tb.Text = mobileType.GetProperty(tb.Name).GetValue(mobile).ToString();