以编程方式检查DataBound CheckListBox

我有一个DataBound“CheckedListBox”,我需要检查一些项目。 我尝试使用以下代码…

if (!string.IsNullOrEmpty(search.Languages)) { string[] langs = search.Languages.Split(','); for (int i = 0; i < (langs.Length - 1); i++) { for (int j = 0; j < clbLang.Items.Count; j++) { string lng = clbLang.Items[j] as string; if (lng.Trim() == langs[i]) { clbLang.SetItemChecked(j, true); break; } } } } 

没有错误,debuged执行正在经历“ 检查 ”过程,但最后我看不到任何检查它。

然后我添加了一个按钮并添加了以下代码。 ( 点击查看所有项目

 private void button9_Click(object sender, EventArgs e) { for (int i = 0; i < clbLang.Items.Count; i++) { clbLang.SetItemChecked(i, true); } } 

它正在“ 检查 ”所有项目,请告诉我是否有人可以在这里看到问题……?

终于找到了,这是MS推出的一个Bug

这里有很好的解释。

这个问题很容易重现。 只需隐藏并显示数据绑定CheckedListBox,您就会注意到以前检查过的项目是如何取消选中的。

CheckedListBox SetItemChecked方法不起作用

所以我们必须找到一个解决方法……我尝试了以下方式,它工作得很好……

在我打电话检查项目的地方,我添加了以下内容……我正在添加我需要检查控件的Tag

 if (!string.IsNullOrEmpty(search.Languages)) { clbLang.Tag = search.Languages; } 

然后,在该控件的“VisibleChanged()”事件中执行代码。

 private void clbLang_VisibleChanged(object sender, EventArgs e) { string lngs = clbLang.Tag as string; if (!string.IsNullOrEmpty(lngs)) { string[] langs = lngs.Split(','); foreach (string lang in langs) { int j = 0; foreach (DataRowView row in clbLang.Items) { if (row != null) { string lng = row[1] as string; if (lng.Trim() == lang) { clbLang.SetItemChecked(j, true); break; } } j++; } } } } 

这适合我,希望它会让你受益…