我正在尝试维护用户设置中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
。
我做错了什么/失踪了?
答案 0 :(得分:8)
由于CheckedListBox.CheckedItems
属性不能与设置绑定,因此您应该添加字符串属性并将选中的项目存储为设置中的逗号分隔字符串,并在关闭表单时保存设置,并在表单Load中设置CheckedListBox的选中项目。 / p>
保存CheckedItems
的{{1}}:
CheckedListBox
文件添加到Settings
文件夹中的项目中,或者如果您打开它,则将其添加到项目中。Properties
CheckedItems
形式的事件中,从设置中读取选中的项目,并使用Load
在CheckedListBox中设置选中的项目。SetItemChecked
事件中,阅读CheckedListBox的FormClosing
并将设置保存为逗号分隔字符串。<强>代码:强>
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
相关联的类型上调用PropertyBinding
或ConvertToString
。如果这不成功,则使用XML序列化。 [2]因此,如果您没有使用只读属性或无构造函数的类,则可以使用自定义ConvertFromString
或自定义序列化程序序列化值。