Получить имя объекта из строки и использовать его таким образом

Название может не иметь такого большого смысла, как я могу здесь..

Скажем, у меня есть 5 контрольных списков. Для каждого из них мне нужен один флажок, который я могу щелкнуть, чтобы отметить/снять все элементы в соответствующем контрольном списке..

Я мог бы легко сделать это, используя CheckedChanged для каждого флажка, который проверяет/снимает все элементы в их списках.. Но я хочу создать одну функцию, которая делает это для каждого списка.. Как я могу это сделать? Я думал что-то в этом роде

    private void internalModsChkAll_CheckedChanged(object sender, EventArgs e)
    {
        testfunktion("internalModsChkAll", "internalModsChkList");
    }

    private void testfunktion(string from, string to) 
    {
        if ([from].Checked == true)
        {
            for (int i = 0; i < [to].Items.Count; i++)
            {
                [to].SetItemChecked(i, true);
            }
        }
        else
        {
            for (int i = 0; i < [to].Items.Count; i++)
            {
                [to].SetItemChecked(i, false);
            }
        }
    }

Я надеюсь, вы видите, что я пытаюсь сделать здесь.. Однако вышеописанное не работает :(

Какие-либо предложения ?


person Daniel Jørgensen    schedule 05.11.2013    source источник
comment
Можете ли вы опубликовать свою разметку для всех списков флажков или это гипотетически?   -  person Karl Anderson    schedule 06.11.2013
comment
Какой фреймворк вы используете для фронтенда? Это приложение WPF или веб-приложение?   -  person 123 456 789 0    schedule 06.11.2013
comment
Вместо строки передайте CheckedListBox методу   -  person Sergey Berezovskiy    schedule 06.11.2013
comment
лениберезовский ваше предложение работает!   -  person Daniel Jørgensen    schedule 06.11.2013
comment
@DanielJørgensen Добро пожаловать :)   -  person Sergey Berezovskiy    schedule 06.11.2013


Ответы (2)


Предполагая WinForms, я думаю, вы ищете Controls.Find() и Cast:

    private void testfunktion(string from, string to) 
    {  
        Control[] matches = this.Controls.Find(from, true);
        if (matches.Length > 0 && matches[0] is CheckBox)
        {
            CheckBox CB = (CheckBox)matches[0];
            matches = this.Controls.Find(to, true);
            if (matches.Length > 0 && matches[0] is CheckedListBox)
            {
                CheckedListBox CLB = (CheckedListBox)matches[0];
                for (int i = 0; i < CLB.Items.Count; i++)
                {
                    CLB.SetItemChecked(i, CB.Checked);
                }    
            }
        }
    }
person Idle_Mind    schedule 05.11.2013

Как предложил lazyberezovsky, здесь тот же код, что и в исходном посте, но рабочий, чтобы другие могли видеть :-)

    private void internalModsChkAll_CheckedChanged(object sender, EventArgs e)
    {
        checkAll(internalModsChkAll, internalModsChkList);
    }

    public void checkAll(CheckBox from, CheckedListBox to) 
    {
        if (from.Checked == true)
        {
            for (int i = 0; i < to.Items.Count; i++)
            {
                to.SetItemChecked(i, true);
            }
        }
        else
        {
            for (int i = 0; i < to.Items.Count; i++)
            {
                to.SetItemChecked(i, false);
            }
        }
    }
person Daniel Jørgensen    schedule 05.11.2013