繁体   English   中英

C#切换大小写复选框

[英]C# Switch case on checkbox

我有以下代码来处理12个复选框上的CheckedChanged -event。

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

现在,我要实现一个复选框,如果选中该复选框,那么还将选中所有其他复选框,并将所有元素添加到列表中。

也就是说,我想以某种方式遍历所有情况,以便可以用值填充每个列表。

编辑:仅供参考:每个复选框添加的值(名称,链接等)是不同的。

有什么建议么?

您可以从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,则需要复选框的父控件。 在我的示例中,“窗口”具有一个Grid ,该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;
}

一种可能的解决方案是创建一个字典,其中每个键元素是复选框的名称,而值是您要对该复选框执行的Action。

现在,您不再需要che开关,只需调用该复选框所需的方法即可

// 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();
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM