[英]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.