动态填充文本框文本

时间:2013-09-17 11:58:20

标签: c# winforms reflection

我有这个数组,其中包含类和值类型的每个属性的名称......

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);

虽然它有效但我想知道它是否是最好的方式......?谢谢

2 个答案:

答案 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();