我有以下代码处理12个复选框上的CheckedChanged
- 事件。
private void cbJournal_CheckedChanged(object sender, RoutedEventArgs e)
{
CheckBox chk = (CheckBox)sender;
if (chk.IsChecked == true)
{
switch (chk.Name)
{
case "cbErbbstg":
{
month = Months[idxMonth];
LinkToRSS.Add(link + month);
RSSname.Add(name);
Picture.Add(picture);
ID.Add(100);
}
break;
case "cbGstb":
{
month = Months[idxMonth];
LinkToRSS.Add(link + month);
RSSname.Add(name);
Picture.Add(picture);
ID.Add(200);
}
break;
}
}
现在我要实现一个复选框,如果选中该复选框,也会检查所有其他复选框,并将所有元素添加到列表中。
也就是说,我想以某种方式遍历所有情况,因此每个列表都可以填充值。
修改 只是fyi:添加的值(名称,链接等)对于每个复选框都是不同的。
有什么建议吗?
答案 0 :(得分:3)
您可以从Form.Controls集合中获取所有复选框的列表:
List<CheckBox> chbList = this.Controls.OfType<CheckBox>().ToList();
现在遍历列表并将Checked
属性设置为true
。这样就会触发所有CheckedChanged
个事件。
foreach (var chb in chbList)
{
chb.Checked = true;
}
如果您将它们连接到同一个事件处理程序,您也可以直接调用该方法:
foreach (var chb in chbList)
{
cbJournal_CheckedChanged(chb, new RoutedEventArgs());
}
编辑:
如果您使用WPF,则需要Checkbox的父控件。我的例子是Window有一个Grid
,它是复选框的父级:
Grid myGrid = this.Content as Grid;
List<CheckBox> chbList = myGrid.Children.OfType<CheckBox>().ToList();
请注意,WPF中的属性称为IsChecked
:
foreach (var chb in chbList)
{
chb.IsChecked = true;
}
答案 1 :(得分:1)
一种可能的解决方案是创建一个字典,其中每个键元素都是复选框的名称,而值是您要为该复选框执行的操作。
现在你不再需要che switch了,你可以简单地调用该复选框的预期方法
// Declare this at the class global level
Dictionary<string, Action> checkExecuter = new Dictionary<string, Action>();
// Initialize it somewhere at the start of your class lifetime
checkExecuter.Add("cbErbbstg", OnCbErbbstgChecked);
// add other methods here
checkExecuter.Add("cbAllBox", OnAllBox);
// Action to execute when the cbErbbstg is checked
void OnCbErbbstgChecked()
{
month = Months[idxMonth];
LinkToRSS.Add(link + month);
RSSname.Add(name);
Picture.Add(picture);
ID.Add(100);
}
// Action to execute when the cbAllBox is checked
void onAllBox()
{
foreach(KeyValuePair<string, Action> kvp in checkExecuter)
{
if(kvp.Key != "cbAllBox")
kvp.Value.Invoke();
}
}
private void cbJournal_CheckedChanged(object sender, RoutedEventArgs e)
{
CheckBox chk = (CheckBox)sender;
if (chk.IsChecked && checkExecuter.ContainsKey(chk.Name))
{
checkExecuter[chk.Name].Invoke();
}
}