Сохранить объекты CheckedListBox в настройках

Я пытаюсь сохранить список проверенных элементов в CheckedListBox в настройках пользователя, а затем перезагрузить их при загрузке приложения.

В моем файле Settings.settings я добавил следующее:

    

И, в chkList_ItemCheck , я делаю следующее:

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

Но по какой-то причине, когда я выхожу из приложения, повторно открываю и проверяю значение Properties.Settings.Default.obj , оно равно null .

Что я делаю неправильно / отсутствует?

Поскольку свойство CheckedListBox.CheckedItems не привязывается к настройкам, вы должны добавить свойство строки и сохранить отмеченные элементы в виде строки с разделителями-запятыми в настройках и сохранить настройки при закрытии формы и установить отмеченные элементы CheckedListBox в форме Load.

Чтобы сохранить CheckedItems CheckedListBox :

  1. Добавьте файл Settings в свой проект в папке « Properties », или если у вас есть это, откройте его.
  2. Добавьте свойство настройки строки с именем CheckedItems
  3. В Load событие формы» прочитайте отмеченные элементы из настроек и установите отмеченные элементы в CheckedListBox с помощью SetItemChecked .
  4. В событии FormClosing прочитайте CheckedItems of CheckedListBox и сохраните его в виде строки, разделенной запятыми.

Код:

 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() .ToArray(); Properties.Settings.Default.CheckedItems = string.Join(",", indices); Properties.Settings.Default.Save(); } 

Как я узнаю, что он не привязан к настройкам?

В качестве первого доказательства для каждого элемента управления в режиме конструктора в сетке свойств вы можете проверить + ( ApplicationSettings ) ( PropertyBinding ) […], чтобы просмотреть список свойств, которые поддерживают привязку свойств.

Кроме того, вы должны знать: « Параметры приложения используют архитектуру привязки данных Windows Forms для обеспечения двусторонней связи обновлений настроек между объектом настроек и компонентами». [1]

Например, когда вы привязываете свойство BackColor вашего CheckedListBox к свойству MyBackColor , вот код, который создает для него конструктор:

 this.checkedListBox1.DataBindings.Add( new System.Windows.Forms.Binding("BackColor", global::StackSamplesCS.Properties.Settings.Default, "MyBackColor", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged)); 

Теперь давайте посмотрим на определение свойства [2] :

 [Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public CheckedListBox.CheckedItemCollection CheckedItems { get; } 

CheckedListBox.CheckedItems или CheckedListBox.CheckedItems нельзя назначить, поскольку он CheckedListBox.CheckedItems только для чтения

Есть ли способ лучше?

Короткий ответ для этого свойства: Нет.

Предположим, что у нас есть свойство MyCheckedItems :

 [UserScopedSetting()] public CheckedListBox.CheckedItemCollection MyCheckedItems { get { return ((CheckedListBox.CheckedItemCollection)this["MyCheckedItems"]); } set { this["MyCheckedItems"] = (CheckedListBox.CheckedItemCollection)value; } } 

Как мы можем или установим поставщика экземпляра CheckedListBox.CheckedItemCollection ?

Тип CheckedListBox.CheckedItemCollection имеет CheckedListBox.CheckedItemCollection конструкторов, определенных

Поэтому мы не можем его создать. Единственным конструктором, который CheckedListBox использует внутри него, является [2] :

 internal CheckedItemCollection(CheckedListBox owner) 

Кроме того, единственный способ добавить элемент в эту коллекцию – это внутренний метод CheckedItemCollection :

 internal void SetCheckedState(int index, CheckState value) 

Таким образом, мы не сможем сделать лучшее обходное решение для этого свойства.

Дополнительная информация:

  • Для каждого элемента управления в режиме конструктора в сетке свойств вы можете проверить + ( ApplicationSettings ) ( PropertyBinding ) […], чтобы просмотреть список свойств, поддерживающих привязку свойств.
  • Настройка сериализации работает таким образом, она сначала пытается вызвать ConvertToString или ConvertFromString в соответствующем TypeConverter . Если это не удается, вместо этого используется сериализация XML. [1] Итак, для случаев, когда вы не сталкиваетесь с свойствами только для чтения или classами без конструктора, вы можете сериализовать значение с помощью настраиваемого TypeConverter или настраиваемого сериализатора.