Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Проблема с Сохранением настроек


Автор: drdoom 21.11.2008, 22:17
Многие знают что можно сохранить настройки программы следующим образом
Код

           Properties.Settings settings = new Maria.Test.Properties.Settings();
            settings.Width = width;
            settings.Height = height;
            settings.Save();

где width и height это собстно то что вы хотите сохранить а settings.Width и settings.Height  поля сохранений задаваемые в файле Settings.settings.
так вот у мя проблема возникла с с этим. Есть следующий код
Код

           Properties.Settings settings = new Maria.Test.Properties.Settings();
            settings.Width = width;
            settings.Height = height;
            settings.SplitterPosition = splitterPosition;
            settings.ColumnInfoCollection = columnInfoCollection;
            settings.Save();

В нем первые три настройки сохраняются нормально, а вот четвертая, которая ColumnInfoCollection не хочет. 
ColumnInfoCollection это ArrayList экземпляров вот этого класса 
Код

    public class ColumnInfo
    {
        private string propertyName;

        public string PropertyName
        {
            get { return propertyName; }
            set { propertyName = value; }
        }

        private double width;

        public double Width
        {
            get { return width; }
            set { width = value; }
        }

        private string header;

        public string Header
        {
            get { return header; }
            set { header = value; }
        }
         
    }

Подробнее о проблеме: останавливал прогу перед методом Save(), в поле  settings.ColumnInfoCollection все записалось прально. Но когда я запускаю следющую функции при старте программы :
Код

            Properties.Settings settings = new Properties.Settings();
            width = settings.Width;
            height = settings.Height;
            splitterPosition = settings.SplitterPosition;
            columnInfoCollection = settings.ColumnInfoCollection;
            

То первые три значения загружаются точно такими же каким были во время сохнанения, а  settings.ColumnInfoCollection =null.
Возможно проблема в том что коллекция из экземпляров пользовательского класса, потому что точно такой же ArrayList со значениями double сохраняется и загружается нормально.
Заранее спасибо за ответ.

Автор: Veitmen 24.11.2008, 07:47
Попробуй добавить атрибут Serializable к классу.

Код

[Serializable]
 public class ColumnInfo
    {
        private string propertyName;

        public string PropertyName
        {
            get { return propertyName; }
            set { propertyName = value; }
        }

        private double width;

        public double Width
        {
            get { return width; }
            set { width = value; }
        }

        private string header;

        public string Header
        {
            get { return header; }
            set { header = value; }
        }
         
    }

Не поможет пиши.

Автор: drdoom 24.11.2008, 07:54
Veitmen, уже пробывал, не помогает, два дня с этой проблемой бьюсь, прям хочется класс на отдельные коллекции разбить, и отдельно сохранить, но это так убого будет выглядеть

Автор: Veitmen 24.11.2008, 09:53
Пробуй так
Код

            ArrayList  list = new ArrayList();
            list.Add(new ColumnInfo());
            Type[] types = new Type[1];
            types[0] = typeof (ColumnInfo);
            //Создаем сериализатор
            XmlSerializer ser = new XmlSerializer(typeof(ArrayList ), types);
            // создаем writer, в который будет происходить сериализация
            StringBuilder sb = new StringBuilder();
            StringWriter w = new StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture);
            // сериализуем
            ser.Serialize(w, list);
            string xml = sb.ToString();
            settings.ColumnInfoCollection = xml;
            settings.Save();

            //Десериализуешь
            // создаем reader
            StringReader reader = new StringReader(settings.ColumnInfoCollection );
            // создаем XmlSerializer
            XmlSerializer dsr = new XmlSerializer(typeof(ArrayList), types);
            // десериализуем 
            ArrayList clone = (ArrayList)dsr.Deserialize(reader);

Автор: drdoom 24.11.2008, 11:39
Veitmen, Огромное спасибо) работает как часы)

Автор: Veitmen 24.11.2008, 11:50
Нез.) Пометь что вопрос решен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)