Итерация по конкретному элементу управления и присвоение ему свойства

1

Предположим, у меня есть три флажка с именем chk1, chk2 и chk3 в ASP.NET. Можно ли назначить свойство каждому из них программным путем, добавив номер к имени переменной и используя цикл for?

Например:

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

Если это невозможно, можете ли вы дать мне лучшее решение или подход к этой проблеме?

Теги:
for-loop
checkbox

1 ответ

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

Теперь вы получаете все флажки с этими идентификаторами следующим образом:

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
  • 0
    как насчет ASP.NET?
  • 0
    @SageTheGreat: я добавил подход ASP.NET
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню