可以使用以下方法来保留级联 CheckedListBox 中项的选中状态:
Dictionary checkedStates = new Dictionary();
private void checkedListBox_ItemCheck(object sender, ItemCheckEventArgs e)
{
int index = e.Index;
bool isChecked = e.NewValue == CheckState.Checked;
checkedStates[index] = isChecked;
// 级联更新子项的选中状态
UpdateChildItems(index, isChecked);
// 级联更新父项的选中状态
UpdateParentItems(index);
}
private void UpdateChildItems(int parentIndex, bool isChecked)
{
int childCount = checkedListBox.GetSelectedIndices().Length;
for (int i = parentIndex + 1; i < childCount; i++)
{
checkedStates[i] = isChecked;
checkedListBox.SetItemChecked(i, isChecked);
}
}
private void UpdateParentItems(int childIndex)
{
int parentIndex = GetParentItemIndex(childIndex);
if (parentIndex != -1)
{
bool allChildrenChecked = true;
for (int i = parentIndex + 1; i <= childIndex; i++)
{
if (!checkedStates[i])
{
allChildrenChecked = false;
break;
}
}
checkedStates[parentIndex] = allChildrenChecked;
checkedListBox.SetItemChecked(parentIndex, allChildrenChecked);
// 递归更新父项的选中状态
UpdateParentItems(parentIndex);
}
}
private void Form_Load(object sender, EventArgs e)
{
// 初始化级联 CheckedListBox
checkedListBox.Parent = this; // 设置 CheckedListBox 的父控件为当前窗体
checkedListBox.Dock = DockStyle.Fill; // 将 CheckedListBox 与窗体的边界对齐
checkedListBox.CheckOnClick = true; // 设置点击项时立即选中或取消选中
// 添加父项和子项
checkedListBox.Items.Add("父项 1", CheckState.Unchecked);
checkedListBox.Items.Add("子项 1-1", CheckState.Unchecked);
checkedListBox.Items.Add("子项 1-2", CheckState.Unchecked);
checkedListBox.Items.Add("父项 2", CheckState.Unchecked);
checkedListBox.Items.Add("子项 2-1", CheckState.Unchecked);
checkedListBox.Items.Add("子项 2-2", CheckState.Unchecked);
// 初始化选中状态
int itemCount = checkedListBox.Items.Count;
for (int i = 0; i < itemCount; i++)
{
checkedStates[i] = false;
}
}
这样就能够保留级联 CheckedListBox 中项的选中状态了。