将CheckedListBox项目保存到设置

时间:2015-09-25 01:13:20

标签: c# .net winforms checkedlistbox settings.settings

我正在尝试维护用户设置中CheckedListBox中的已检查项目列表,然后在应用程序加载时重新加载它们。

在我的Settings.settings文件中,我添加了以下内容:

<Setting Name="obj" Type="System.Windows.Forms.CheckedListBox.ObjectCollection" Scope="User">
    <Value Profile="(Default)" />
</Setting>

而且,在chkList_ItemCheck上,我正在执行以下操作:

Properties.Settings.Default.obj = chkList.Items;
Properties.Settings.Default.Save()

但出于某种原因,当我退出应用时,重新打开并检查Properties.Settings.Default.obj的值,它是null

我做错了什么/失踪了?

1 个答案:

答案 0 :(得分:8)

由于CheckedListBox.CheckedItems属性不能与设置绑定,因此您应该添加字符串属性并将选中的项目存储为设置中的逗号分隔字符串,并在关闭表单时保存设置,并在表单Load中设置CheckedListBox的选中项目。 / p>

保存CheckedItems的{​​{1}}:

  1. CheckedListBox文件添加到Settings文件夹中的项目中,或者如果您打开它,则将其添加到项目中。
  2. 添加名为Properties
  3. 的字符串设置属性
  4. CheckedItems形式的事件中,从设置中读取选中的项目,并使用Load在CheckedListBox中设置选中的项目。
  5. SetItemChecked事件中,阅读CheckedListBox的FormClosing并将设置保存为逗号分隔字符串。
  6. <强>代码:

    CheckedItems

    我怎么知道它不能与设置绑定?

    作为第一个证据,对于设计者模式中的每个控件,在属性网格中,您可以检查+(private void Form1_Load(object sender, EventArgs e) { if (!string.IsNullOrEmpty(Properties.Settings.Default.CheckedItems)) { Properties.Settings.Default.CheckedItems.Split(',') .ToList() .ForEach(item => { var index = this.checkedListBox1.Items.IndexOf(item); this.checkedListBox1.SetItemChecked(index, true); }); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { var indices = this.checkedListBox1.CheckedItems.Cast<string>() .ToArray(); Properties.Settings.Default.CheckedItems = string.Join(",", indices); Properties.Settings.Default.Save(); } )(ApplicationSettings)[...]以查看支持属性的属性列表捆绑。

    此外,您应该知道&#34; 应用程序设置使用Windows窗体数据绑定体系结构来提供设置对象和组件之间的设置更新的双向通信。&#34; {{ 3}}

    例如,当您将PropertyBinding的{​​{1}}属性绑定到BackColor属性时,以下是Designer为其生成的代码:

    CheckedListBox

    现在让我们看看属性定义[1]

    MyBackColor
      

    属性或索引器this.checkedListBox1.DataBindings.Add( new System.Windows.Forms.Binding("BackColor", global::StackSamplesCS.Properties.Settings.Default, "MyBackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 不能   分配给因为它是只读的

    有更好的方法吗?

    这个属性的简短答案是否。

    假设我们有一个属性[Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public CheckedListBox.CheckedItemCollection CheckedItems { get; }

    CheckedListBox.CheckedItems

    我们如何设置提供程序实例MyCheckedItems

      

    类型[UserScopedSetting()] public CheckedListBox.CheckedItemCollection MyCheckedItems { get { return ((CheckedListBox.CheckedItemCollection)this["MyCheckedItems"]); } set { this["MyCheckedItems"] = (CheckedListBox.CheckedItemCollection)value; } } 没有公开   构造函数定义

    所以我们无法实例化它。 CheckedListBox内部使用它的唯一构造函数是[2]

    CheckedListBox.CheckedItemCollection

    此外,将项目添加到此集合的唯一方法是CheckedListBox.CheckedItemCollection的内部方法:

    internal CheckedItemCollection(CheckedListBox owner)
    

    因此,我们无法为此媒体做更好的解决方法。

    更多信息:

    • 对于设计器模式中的每个控件,在属性网格中,您可以检查+(CheckedItemCollection)(internal void SetCheckedState(int index, CheckState value) )[...]以查看支持属性绑定的属性列表。
    • 设置序列化以这种方式工作,它首先尝试在与ApplicationSettings相关联的类型上调用PropertyBindingConvertToString。如果这不成功,则使用XML序列化。 [2]因此,如果您没有使用只读属性或无构造函数的类,则可以使用自定义ConvertFromString或自定义序列化程序序列化值。