1
假設我在ASP.NET中有三個名爲chk1
,chk2
和chk3
的複選框。是否可以通過將編號附加到變量名稱並使用for
循環以編程方式將屬性分配給它們中的每一個?遍歷特定控件併爲其分配屬性
例如:
for (int x=1; x<=3; x++)
{
chk+[x].Checked = true;
}
如果這是不可能的,你能不能給我一個更好的解決方案或方法解決這個問題?
假設我在ASP.NET中有三個名爲chk1
,chk2
和chk3
的複選框。是否可以通過將編號附加到變量名稱並使用for
循環以編程方式將屬性分配給它們中的每一個?遍歷特定控件併爲其分配屬性
例如:
for (int x=1; x<=3; x++)
{
chk+[x].Checked = true;
}
如果這是不可能的,你能不能給我一個更好的解決方案或方法解決這個問題?
。假定的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
ASP.NET如何? – 2014-09-30 13:54:41
@SageTheGreat:我已經添加了ASP.NET方法 – 2014-09-30 13:58:39
感謝您的答案。將嘗試做你已經分享的東西。 – 2014-09-30 14:01:39