在 checkListBox 中保存用户的点击

Save a user's clicks in checkListBox

在我的应用程序中,我有几个 checkListBoxes,我需要保存对此列表的点击。这意味着下次我不需要一次又一次地点击它们。

代码:

public Form2()
{
    InitializeComponent();
    InitializeSecondForm();
}

private void InitializeSecondForm()
{
    this.Height = Properties.Settings.Default.SecondFormHeight;
    this.Width = Properties.Settings.Default.SecondFormWidth;
    this.Location = Properties.Settings.Default.SecondFormLocation;

    this.FormClosing += SecondFormClosingEventHandler;
    this.StartPosition = FormStartPosition.Manual;
}

private void SecondFormClosingEventHandler(object sender, FormClosingEventArgs e)
{
    Properties.Settings.Default.SecondFormHeight = this.Height;
    Properties.Settings.Default.SecondFormWidth = this.Width;
    Properties.Settings.Default.SecondFormLocation = this.Location;

    Properties.Settings.Default.Save();
}

我试图用这个问题作为我的答案,但它不起作用:

有了一个简单的复选框,这不是问题,但这里我们有一个列表。

知道怎么做吗?

在这种情况下,我更喜欢像 SQLite 这样的简单数据库。 使用此数据库保存用户配置文件。用户配置文件数据将存储所有此类数据。例如,可以将用户名和密码保存到其中,以便用户下次登录时记住,或者用户在使用系统时选择的所有设置和配置。

也许将每个选中项目的标识符保存到 json 文件中。

在下面我对 CheckedListBox 所做的,对于多个 CheckedListBox 控件,您需要调整代码以使用一个 json 具有修改结构的文件来说明多个 CheckedListBox 控件或一个 json 文件每个 CheckedListBox。

例如,将项目加载到以下 class

public class Product
{
    public int ProductID { get; set; }
    public string ProductName { get; set; }
    public override string ToString()
    {
        return ProductName;
    }

}

将以下 class 用于 read/write 到 json 文件,在本例中使用 json.net,但也适用于 system.text.json

public class JsonOperations
{
    /// <summary>
    /// In your app you need to setup a different file name for each CheckedListBox
    /// </summary>
    public static string FileName => 
        Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Checked.json");

    /// <summary>
    /// Save only checked products
    /// </summary>
    /// <param name="list"></param>
    public static void Save(List<ProductItem> list)
    {
        string json = JsonConvert.SerializeObject(list, Formatting.Indented);
        File.WriteAllText(FileName, json);
    }

    /// <summary>
    /// Read back if file exists
    /// </summary>
    /// <returns></returns>
    public static List<ProductItem> Read()
    {
        List<ProductItem> list = new List<ProductItem>();

        if (File.Exists(FileName))
        {
            list = JsonConvert.DeserializeObject<List<ProductItem>>(File.ReadAllText(FileName));
        }

        return list;
    }
}

下面的classes提供了从上面提到的json中获取checked items set checked items的方法。

public static class CheckedListBoxExtensions
{
    public static List<ProductItem> IndexList(this CheckedListBox sender)
    {
        return
        (
            from item in sender.Items.Cast<Product>()
                .Select(
                    (data, index) =>
                        new ProductItem()
                        {
                            ProductID = data.ProductID,
                            Index = index
                        }
                )
                .Where((x) => sender.GetItemChecked(x.Index))
            select item
        ).ToList();
    }
    public static void SetChecked(this CheckedListBox sender, int identifier, bool checkedState = true)
    {
        var result = sender.Items.Cast<Product>()
            .Select((item, index) => new CheckItem
            {
                Product = item, 
                Index = index
            })
            .FirstOrDefault(@this => @this.Product.ProductID == identifier);

        if (result != null)
        {
            sender.SetItemChecked(result.Index, checkedState);
        }
    }
}

public class CheckItem { public产品产品{得到;放; } public int 索引 { get;放; } }

表单代码将类似于以下内容,以读取表单显示事件中的选中项并保存表单关闭事件中的选中项。

public partial class SaveItemsForm : Form
{
    private List<Product> _products = new List<Product>();
    public SaveItemsForm()
    {
        InitializeComponent();
        Shown += OnShown;
        Closing += OnClosing;
    }

    private void OnClosing(object sender, CancelEventArgs e)
    {
        List<ProductItem> checkedItems = ProductCheckedListBox.IndexList();
        if (checkedItems.Count > 0)
        {
            JsonOperations.Save(checkedItems);
        }
        else
        {
            JsonOperations.Save(new List<ProductItem>());
        }
    }

    private void OnShown(object sender, EventArgs e)
    {
        _products = SqlServerOperations.ProductsByCategoryIdentifier(1);

        ProductCheckedListBox.DataSource = _products;

        /*
         * Search for each product by id, if in the CheckedListBox check it
         */
        var items = JsonOperations.Read();
        if (items.Count >0 )
        {
            items.ForEach( x => ProductCheckedListBox.SetChecked(x.ProductID));
        }
    }
}