2014-09-30 39 views
1

假設我在ASP.NET中有三個名爲chk1,chk2chk3的複選框。是否可以通過將編號附加到變量名稱並使用for循環以編程方式將屬性分配給它們中的每一個?遍歷特定控件併爲其分配屬性

例如:

for (int x=1; x<=3; x++) 
{ 
    chk+[x].Checked = true; 
} 

如果這是不可能的,你能不能給我一個更好的解決方案或方法解決這個問題?

回答

3

。假定的WinForms(ASP.NET標籤後來加入),你可以使用ControlCollection.Find,第二個參數指定如果所有的子控件也應搜索:

for (int x=1; x<=3; x++) 
{ 
    Control[] ctrl = this.Controls.Find("chk" + x, true); 
    foreach (CheckBox chk in ctrl.OfType<CheckBox>()) 
     chk.Checked = true; 
} 

如果它實際上是ASP.NET你可以使用這個遞歸搜索推廣法:

public static class ControlExtensions 
{ 
    public static IEnumerable<Control> GetControlsRecursively(this Control parent) 
    { 
     foreach (Control c in parent.Controls) 
     { 
      yield return c; 

      if (c.HasControls()) 
      { 
       foreach (Control control in c.GetControlsRecursively()) 
       { 
        yield return control; 
       } 
      } 
     } 
    } 
} 

現在你得到這些ID的所有複選框以這樣的方式

var allIDs = Enumerable.Range(1, 3).Select(i => "chk" + i).ToList(); 
var allCheckBoxes = this.GetControlsRecursively().OfType<CheckBox>() 
    .Where(chk => allIDs.Contains(chk.ID)); 
foreach(CheckBox chk in allCheckBoxes) 
    chk.Checked = true; 

但是,我很少使用這種遞歸方法。這有點容易出錯,因爲其他的NamingContainer可以再次包含相同的ID。相反,我只會使用正確的NamingContainer。例如,如果您有一個Panel,其中所有相關的CheckBox都在您可以簡單地使用myPanel.Controls.OfType<CheckBox>()

另外,您應該爲控件使用更有意義的ID。那麼你不能再使用這樣的循環,但你可以開始編寫更強大和可維護的代碼,如:

chkUserActive.Checked = true; // just an example 
+0

ASP.NET如何? – 2014-09-30 13:54:41

+0

@SageTheGreat:我已經添加了ASP.NET方法 – 2014-09-30 13:58:39

+0

感謝您的答案。將嘗試做你已經分享的東西。 – 2014-09-30 14:01:39