0

我在一个winform(文本框/复选框)中有一堆字段,它们的名称非常相似,并附加了数字。例如,AName1、BName1、CName1,然后是 AName2、BName2、CName2 等。我想做的是在 forloop 中遍历它们,如下所示:

for (int i = 0, i<4, i++)
{
    ANamei.Text = blah;
    BNamei.Text = blah;
    CNamei.Text = blah;
}

显然,上面代码中的 i 不起作用。我的问题是,如何在循环中访问给定此变量的文本框对象?谢谢!

4

2 回答 2

1

您可以将所有控件添加到数组中,然后遍历数组:

private readonly Control[] m_Controls;

public MyControl() {
    InitializeComponent();

    m_Controls = new[] {
        AName1, AName2, AName3,
        BName1, BName2, BName3,
    }
}

private void DoStuff(string text) {
    foreach (Control c in m_Controls) {
        c.Text = text;
    }
}

或者,如果您真的不想拥有硬编码列表,并且控件都是您运行代码的控件的一部分,则可以使用 Controls 集合:

private void DoStuff(string text) {
    for (int i=0; i<4; i++) {
        this.Controls["AName" + i].Text = text;
    }
}

但是,如果表单上有很多控件,这会很慢,因为它会线性扫描表单上的每个控件,直到找到具有指定名称的控件。

编辑:对于多个 repititions,您可以使用嵌套循环:

for (string prefix in new[] { "A", "B", "C", ...}) {
    for (int i=0; i<4; i++) {
        this.Controls[prefix + "Name" + i].Text = text;
    }
}
于 2013-04-16T15:59:14.957 回答
1

如果你必须为这个类的成员命名,你也可以用反射来做,但这可能有点矫枉过正,也比@thecoop的解决方案慢,但这里有一个小样本,仅供参考:

class MyObject
{
    public string Text { get; set; }
}

class MyClass
{
    private MyObject _myObject1 = new MyObject();
    private MyObject _myObject2 = new MyObject();
    private MyObject _myObject3 = new MyObject();

    public void Foo()
    {
        for (int i = 1; i < 4; i++)
        {
            // get the member of this type MyClass
            var member = GetType().GetMember("_myObject" + i, BindingFlags.Instance | BindingFlags.NonPublic);
            var fieldInfo = (FieldInfo)member[0];
            // get the value of the member info
            var field = fieldInfo.GetValue(this);
            // get the property to set
            var propertyInfo = field.GetType().GetProperty("Text");
            // set the value
            propertyInfo.SetValue(field, "my text", null);
        }

    }
}
于 2013-04-16T16:04:53.540 回答