2013-04-16 56 views
0

我有一個字段在一個winform(文本框/複選框)有非常相似的名稱與數字附加到他們。例如,AName1,BName1,CName1,然後AName2,BName2,CName2,等我想要做的是通過他們都在一個for循環迭代,這樣的事情:在代碼如何通過名稱迭代訪問對象(OName1,OName2,OName3 ...)

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

顯然,我以上不起作用。我的問題是,如何訪問循環內給定此變量的文本框對象?謝謝!

+0

通常你不應該使用被改寫的名字找到能夠控制這種方式 - 你生成代碼這些控件?如果是這樣,你應該將它們保存在例如列表或併發包

回答

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

或者,如果你真的不希望有一個硬編碼的列表,以及控件的所有部分你在運行代碼控制,你可以使用控件集合:

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; 
    } 
} 
+0

這比它更具體一些,因爲我正在做一些與AN​​ame,BName和CName非常不同的事情(實際上有大約44種不同的情況),但是每個重複5次(最後的數字是唯一的區別)。所以我正在尋找一種快速的方法來複制第一個案例的已有代碼,併爲其他重複做一遍。那可能嗎? – MLavine

+0

您將不得不在某些時候編寫一些循環代碼。你可以對它進行硬編碼,或者你可以在控件集合或反射上使用名稱查找(考慮到控件名稱查找,這似乎很愚蠢)。您可以使用盡可能多的循環,嵌套或不嵌套,以獲得您想要的行爲。 – thecoop

1

,如果你有名字該類的成員去做,你也可以用反射做,但是這也許有點矯枉過正,也慢於@thecoop 的解決方案,但繼承人一個小樣本,只是FYI:

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

    } 
}