1

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

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

我可以通过反射动态地获得我的类属性值,例如:

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

但这不起作用... :(

更新1:

好的,我让它像这样工作:

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

虽然它有效,但我想知道这是否是最好的方法......?谢谢你

4

2 回答 2

1

我认为您将反射走得太远了。如果您知道控件的位置,请使用该控件上的Controls集合并获取文本框。

foreach(var tb in parentControl.Controls.Where(c => c is TextBox))
    tb.Text = propVals[i++];

propVals您已经检索的值的集合 在哪里。iint保持枚举集合的计数器。

另外,我假设你想要文本集,因为你谈到视觉上看到这个。但是,您的代码让我相信您想要设置文本框名称(这不是可视的)。如果您的代码是准确的,那么您只需这样做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();
于 2013-09-17T12:34:45.863 回答
1

由于这是一个 WinForms 应用程序,因此您可以访问表单的 Controls 集合。与上面的代码示例保持一致,您可以让实际的 TextBox 执行类似的操作。

var tb = this.Controls.OfType<TextBox>().FirstOrDefault(x => x.Name.Equals(textBoxName, StringComparison.InvariantCultureIgnoreCase));

if (tb != null)
{
    tb.Text = property; 
}

在此示例中,属性是您在此处检索的值:

var type = mobile.GetType();
                    var property = type
                                     .GetProperty(mobile.test[i, 1])
                                     .GetValue(mobile);

我希望这有帮助。

于 2013-09-17T12:33:44.067 回答