如果代码在列表中,我需要代码来检查复选框,如果不在列表中,则需要取消选中。 foreach循环只读取列表中的最后一项。 因此,如果最后一项是WNM,则只检查WNM复选框,即使列表中包含其他匹配项。该列表中只有一行字符串。
代码:
foreach (string k in list)
{
if (k == "BGN")
{
CBBGN.Checked = true;
}
else { CBBGN.Checked = false; }
if (k == "LAN")
{
CBLan.Checked = true;
}
else
{
CBLan.Checked = false;
}
if (k == "FGN")
{
CBFGN.Checked = true;
}
else
{
CBFGN.Checked = false;
}
if (k == "WNM")
{
CBWNM.Checked = true;
}
else
{
CBWNM.Checked = false;
}
if (k == "GGN")
{
CBGGN.Checked = true;
}
else
{
CBGGN.Checked = false;
}
}
答案 0 :(得分:4)
您遍历循环并在每次迭代时撤消继续进行的迭代,因为它将达到该项目的每个false
语句的if
。
最初将所有Checked
个状态设置为false
更好的结构。然后迭代列表并仅将Checked
状态设置为true
如果它出现在列表中但不将其设置为false
。
您也可以执行更易于阅读的操作,如果列表可能很大,您可以使用HashSet来提高性能。 (感谢@AlexeiLevenkov )
CBBGN.Checked = list.Contains("BGN");
CBLan.Checked = list.Contains("LAN");
CBFGN.Checked = list.Contains("FGN");
CBWNM.Checked = list.Contains("WNM");
CBGGN.Checked = list.Contains("GGN");
原始修复
CBBGN.Checked = false;
CBLan.Checked = false;
CBFGN.Checked = false;
CBWNM.Checked = false;
CBGGN.Checked = false;
foreach (string k in list)
{
if (k == "BGN")
CBBGN.Checked = true;
if (k == "LAN")
CBLan.Checked = true;
if (k == "FGN")
CBFGN.Checked = true;
if (k == "WNM")
CBWNM.Checked = true;
if (k == "GGN")
CBGGN.Checked = true;
}
答案 1 :(得分:1)
如果您想通过查找元素是否在列表中来控制复选框,只需使用Linq:
CBBGN.Checked = list.Any(s => s == "BGN");
CBLan.Checked = list.Any(s => s == "LAN");
CBFGN.Checked = list.Any(s => s == "FGN");
CBWNM.Checked = list.Any(s => s == "WNM");
CBGGN.Checked = list.Any(s => s == "GGN");
使用HashSet而不是由Alexei提出并由Igor展示当然会更好的性能和可读性。