Предположим, у меня есть три флажка с именем chk1
, chk2
и chk3
в ASP.NET. Можно ли назначить свойство каждому из них программным путем, добавив номер к имени переменной и используя цикл 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;
}
}
}
}
}
Теперь вы получаете все флажки с этими идентификаторами следующим образом:
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;
Однако я редко использовал этот рекурсивный метод. Это немного подвержено ошибкам, так как другие NamingContainers могут снова содержать один и тот же идентификатор. Вместо этого я бы использовал только правильный NamingContainer
. Например, если у вас есть Panel
которой все выпущенные CheckBoxes сидят, вы можете просто использовать myPanel.Controls.OfType<CheckBox>()
.
Кроме того, вы должны использовать более значимый идентификатор для своих элементов управления. Тогда вы больше не можете использовать такие циклы, но вы можете начать писать более надежный и удобный код:
chkUserActive.Checked = true; // just an example