我有一个CheckedListBox,绑定到BindingList:

private BindingList<string> list = new BindingList<string>();
public MyForm()
{
    InitializeComponent();

    list.Add("A");
    list.Add("B");
    list.Add("C");
    list.Add("D");

    checkedListBox.DataSource = collection;
}


单击某个按钮后,列表将更新:

private void Button_Click(object sender, EventArgs e)
{
    list.Insert(0, "Hello!");
}


并且工作正常,CheckedListBox已更新。但是,当某些项目被选中时,单击按钮不仅会更新列表,还会重置所有未选中的项目。我该如何解决?

谢谢!

最佳答案

您需要自己跟踪检查状态。

作为选择,您可以为包含文本和检查状态的项目创建模型类。然后,在控件的ItemCheck事件中,设置项目模型的检查状态值。同样在ListChengedBindingList<T>事件中,刷新项目的检查状态。



创建CheckedListBoxItem类:

public class CheckedListBoxItem
{
    public CheckedListBoxItem(string text)
    {
        Text = text;
    }
    public string Text { get; set; }
    public CheckState CheckState { get; set; }
    public override string ToString()
    {
        return Text;
    }
}


设置CheckedListBox像这样:

private BindingList<CheckedListBoxItem> list = new BindingList<CheckedListBoxItem>();
private void Form1_Load(object sender, EventArgs e)
{
    list.Add(new CheckedListBoxItem("A"));
    list.Add(new CheckedListBoxItem("B"));
    list.Add(new CheckedListBoxItem("C"));
    list.Add(new CheckedListBoxItem("D"));
    checkedListBox1.DataSource = list;
    checkedListBox1.ItemCheck += CheckedListBox1_ItemCheck;
    list.ListChanged += List_ListChanged;
}
private void CheckedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    ((CheckedListBoxItem)checkedListBox1.Items[e.Index]).CheckState = e.NewValue;
}
private void List_ListChanged(object sender, ListChangedEventArgs e)
{
    for (var i = 0; i < checkedListBox1.Items.Count; i++)
    {
        checkedListBox1.SetItemCheckState(i,
            ((CheckedListBoxItem)checkedListBox1.Items[i]).CheckState);
    }
}

关于c# - 数据源中的更新重置CheckedListBox复选框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57607243/

10-11 10:55