Получить имя объекта из строки и использовать его таким образом
Название может не иметь такого большого смысла, как я могу сделать здесь..
Скажем, у меня есть 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);
}
}
}
Я надеюсь, что вы можете увидеть, что я пытаюсь сделать здесь.. Однако выше не работает:(
Какие-либо предложения?
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);
}
}
}
}
По предложению лазыберезовского, здесь тот же код, что и в оригинальном посте, но работающий, чтобы другие могли видеть:-)
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);
}
}
}