Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/106: Рейтинг темы: голосов - 106, средняя оценка - 4.87
10 / 10 / 4
Регистрация: 05.08.2009
Сообщений: 101

Где хранить настройки программы (свойства формы и её компонентов)

06.08.2009, 15:44. Показов 21398. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые, мне необходимо где-то хранить настройки программы (например, если пользователь не хочет видеть статусную панель и её отключил через меню, то при запуске формы она не должна быть показана). Я слышал, что для хранения подобных настроек можно использовать файл settings, файл конфигурации, ini-файл, txt-файл, реестр, но один знакомый прогер посоветовал мне использовать XML, дескать, если C#, то C# + XML = мегабомба. Может кто помочь с сериализацией.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2009, 15:44
Ответы с готовыми решениями:

Где хранить настройки программы
Собственно, вопрос в названии. Пишу программу, в которой много настроек, как зашифрованных, так и нет. Сейчас встал вопрос: "Где...

В чём правильно хранить настройки динамически созданных компонентов
Нужно запомнить такую структуру . Есть не ограниченное количества панелей они могут добавляться , удаляться , изменяться и в каждой из них...

Где лучше хранить настройки?
Мне нужно сохранить в основном цвета. Допустим я задел цвет линиям красный, фон черный и так далее. Потом после нового запуска программы...

50
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
23.12.2009, 16:12
Студворк — интернет-сервис помощи студентам
Да, есть у каждого, это первая строка окна "свойства" (Property)-- ApplicationSettings
там при раскрытии выбираете необходимое из возможных,
а сохраняется все автоматически! Очень удобно.
Удачи.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
23.12.2009, 16:39
Еще раз спасибо! Вы очень помогли. Если появится еще какой-то 'подводный камень' - я напишу. Буду надеяться на помощь.

Добавлено через 9 минут
Кстати, а где эти данные будут храниться?
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
23.12.2009, 16:52
Блин, а я вот сам написал класс для хранения настроек... этот класс сам создаёт что-то типа *.ini файла. Отличие в том, что мой класс ещё и шифрует настройки....

Если хотите, могу поделиться....
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
23.12.2009, 20:22
Не отказался бы. Я тоже когда-то написал, но это слишком долго по сравнению с уже встроенными функциями.
0
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
24.12.2009, 10:05
Цитата Сообщение от body90 Посмотреть сообщение
Еще раз спасибо! Вы очень помогли. Если появится еще какой-то 'подводный камень' - я напишу. Буду надеяться на помощь.

Добавлено через 9 минут
Кстати, а где эти данные будут храниться?
Спасибо за доброе слово. Я рад, что смог помочь.
Пишите, если смогу-помогу.
Данные хранятся в файле user.config типа XML, расположен он в дикой подвложенности текущего юзера, где-то примерно так
C:\Documents and Settings\UserName\Local Settings\Application Data\организация на котор рег VS по умолчанию\Приложение.vshost.exe_Url_gejn h5upq3i4qkln4iucya52vyhgzbi0\1.0.0.0\use r.config.
Удачи.
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
24.12.2009, 22:13
Цитата Сообщение от dimasamchenko Посмотреть сообщение
Да, создастся(при закрытии приложения)! Если при первом запуске приложения файла нет то происходит инициализация значениями по умолчанию(не забудь определить эти значения не все подставляются автоматом!!!).
Позвольте с Вами не согласиться. Я не знаю как с пользовательскими настройками, а вот настройки приложения автоматом не создаются. Проверено. Я сначала мучилась и не могла понять - если нет этого файла, откуда же приложение берет данные? Долго не могла понять. Оказывается, когда ты в студио создаешь файл настроек, эти настройки являются по умолчанию и типа прописываются в самом приложении. Они используются приложением при отсутствии файла настроек. А если этот файл есть, то оно берет настройки из него, но новый файл не создается - это точно.

А вообще мне очень понравилась простота работы с файлом настроек. В дальнейшем буду им обязательно пользоваться. Единственное что - мне-то удобно, а вот безрукому пользователю трудно разобраться в xml файле, чтобы изменить настройки, в ini проще и нагляднее.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
25.12.2009, 01:58
Я не проверял, но по идее, файл создается автоматически когда изменяются стандартные настройки. Иначе б в нем не было смысла. Может быть Вы не использовали метож .Save()?
Не по теме:
Приятно, что среди нас, программистов, есть немало девушек.
0
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
25.12.2009, 10:02
Цитата Сообщение от body90 Посмотреть сообщение
Я не проверял, но по идее, файл создается автоматически когда изменяются стандартные настройки. Иначе б в нем не было смысла. Может быть Вы не использовали метож .Save()?
Не по теме:
Приятно, что среди нас, программистов, есть немало девушек.
Доброго дня Всем!
Правильно, только если что-то изменяли, тогда файл создается.
.Save() тоже необходимо использовать перед закрытием приложения.
body90, полностью с Вами согласен не по теме!

Добавлено через 4 минуты
Цитата Сообщение от Лакшми Посмотреть сообщение
Позвольте с Вами не согласиться. Я не знаю как с пользовательскими настройками, а вот настройки приложения автоматом не создаются. Проверено. Я сначала мучилась и не могла понять - если нет этого файла, откуда же приложение берет данные? Долго не могла понять. Оказывается, когда ты в студио создаешь файл настроек, эти настройки являются по умолчанию и типа прописываются в самом приложении. Они используются приложением при отсутствии файла настроек. А если этот файл есть, то оно берет настройки из него, но новый файл не создается - это точно.

А вообще мне очень понравилась простота работы с файлом настроек. В дальнейшем буду им обязательно пользоваться. Единственное что - мне-то удобно, а вот безрукому пользователю трудно разобраться в xml файле, чтобы изменить настройки, в ini проще и нагляднее.
Доброго дня.
Позвольте и мне с Вами не согласиться.
Напрямую файл изменять даже,как-то некультурно.
А безрукому пользователю вообще лазить по системным вещам противопоказано!
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
25.12.2009, 18:08
Цитата Сообщение от body90 Посмотреть сообщение
Я не проверял, но по идее, файл создается автоматически когда изменяются стандартные настройки. Иначе б в нем не было смысла. Может быть Вы не использовали метож .Save()?
Да-да, совершенно верно! Он наверняка должен появляться при записи новых значений. У меня просто для чтения этот файл. Я там держу имя сервера, имя базы данных и каким образом происходит аутентификация - через sql или windows, ну и соответственно пользователь и пароль.
Цитата Сообщение от body90 Посмотреть сообщение
Не по теме:
Приятно, что среди нас, программистов, есть немало девушек.

Цитата Сообщение от dimasamchenko Посмотреть сообщение
Доброго дня.
Позвольте и мне с Вами не согласиться.
Напрямую файл изменять даже,как-то некультурно.
А безрукому пользователю вообще лазить по системным вещам противопоказано!
Да я знаю... Предложила начальнику для таких безруких сделать маленькую утилитку для установки нужных значений. А он сказал что т.к. моя прога и так является утилитой, а утилита к утилите это не гуд. Пока вопрос повис, может что-нибудь потом придумаем.
1
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 00:29
Возвращаясь к теме...

Завтра собиралась сделать сохранение измененных настроек программы. Однако, косяк выходит... Почитав в инете, я поняла, что изменять можно только пользовательские настройки, которые определены как User, а вот программные, которые определены как Application, являются readOnly... Вот засада-то! Единственное, что приходит в голову - удалять файл настроек и создавать новый. Но каким образом - понятия не имею... Есть еще идеи? Конкретно с файлом настроек, про собственноручно xml-файл пока не говорим.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.01.2010, 02:30
На эту проблему я сам перу дней назад натолкнулся. А почему не хранить настройки для каждого пользователя отдельно? Или создать метод, который будет искать файл настройки у остальных пользователей и копировать в своего)
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 19:10
Сделала я настройки для юзера. Все было замечательно весь день - удаляла этот файл, он создавался снова... Но потом что-то я такое сделала, что файл перестал появляться, а программа откуда-то брала настройки... Вся расстроилась под конец рабочего дня... Куда он делся и где его теперь искать, а главное - что я такого сделала, - вот задачка-то...

Подумываю может тупо на ini-файле сделать все? Немного погуглив поняла, что тут тоже не все так просто...
0
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
13.01.2010, 19:41
Цитата Сообщение от Лакшми Посмотреть сообщение
Сделала я настройки для юзера. Все было замечательно весь день - удаляла этот файл, он создавался снова...
Доброго вечера!
А каким образом Вы сделали настройки для юзера? Поделитесь, если не жалко!
С уважением, Дима.
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 19:50
Отчего же, не жалко совсем. Я выше писала, что при создании файла настроек можно указать область действия конкретной настройки - приложение или пользователь. Вот там и указывается - Application или User.

Цитата Сообщение от Лакшми Посмотреть сообщение
Файл с настройками лежит в зависимости от того, какой выбран Scope (наверное Вы имели в виду "Область"). Если выбрано Application, то хранится в папке проекта, а если User, то в папке пользователя.

Ну вот это и есть определение - настройки для приложения, которые действуют для всех пользователей, и настройки юзера - только для конкретного.
Добавлено через 3 минуты
Но, вообще, как-то уже боязно использовать этот файл настроек, когда не знаешь что он еще выкинет.... И где его искать и что от него ожидать... Лучше уж допотопный, но надежный ini-шник... Наверное... На крайняк можно использовать xml-файл, хотя не хотелось бы, а то пользователю трудно будет в нем разобраться.
1
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
13.01.2010, 20:54
А можно как поступали наши деды - в обычный бинарный файл?
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
13.01.2010, 21:05
Неее... Я щас тренируюсь с обычным текстовым файлом. Очень даже здорово получается. Показать?

Добавлено через 9 минут
Есть текстовый файл Setting.txt такого вида:

ServerName=sql_server\sqlexpress
User=SQL_User
Password=123

И такая маленькая программка - все очень просто:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsApplication6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            string path = Application.StartupPath + "\\Setting.txt";
            string line = "";
            try
            {
                using (StreamReader reader = File.OpenText(path))
                {
                    while (line != null)
                    {
                        line = reader.ReadLine();
                        switch (line.Split('=')[0])
                        { 
                            case "ServerName":
                                textBox1.Text = line.Split('=')[1];
                                break;
                            case "User":
                                textBox2.Text = line.Split('=')[1];
                                break;
                            case "Password":
                                textBox3.Text = line.Split('=')[1];
                                break;
                        }
                    }
                }
            }
            catch
            {
                //Файл не существует
            }
        }
    }
}
Вобщем решено - буду делать именно так и не заморачиваться!
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
13.01.2010, 22:35
Цитата Сообщение от Лакшми Посмотреть сообщение
Я вот тоже сейчас мучаюсь данным вопросом... Знакомый просто создает вручную файл xml и читает из него. А мне кажется более удобным использование settings в самой программе. Пока вроде получается. Ввела параметры вручную в конструкторе, читаю программно.

Часто возникает задача хранить какие-то данныев конфигах, потом быстро и безболезненно их читать, перечитывать, изменять.
Все это очень удобно делать с помощью появившегося с .NET 2.0 средства - Settings.
Добавить их в проект просто - Add new Item - Settings. В моем примере, я дал им красивое и наглядное имя - MySettings

Нажмем OK, и что же произошло? А вот что:

1. Появилось 3 новых файла:
MySettings.Designer.cs
MySettings.settings
MySettings.cs

2. В проекте появился новый член команды - MySettings.settings, если кликнуть по которому, появится красивый дизайнер, с помощью которого можно добавлять свои свойства для хранения.
Каждое свойство содержит следующие критерии:
Name - наименование свойства класса и секции конфига
Type - тип данных (от простых типов, до собственных, лишь бы сериализоваться умели)
Scope - тип хранения и доступа к свойству. Имеет 2 значения - User, Application, на них я остановлюсь попозже.
Value - значение свойства (будет использоваться как значение по умолчанию)

Создадим 2 тестовых свойства:
Name Type Scope Value
MyDate DateTime User любая дата
MyString string Application "какая то строка"


Что при этом происходит:
Волшебным образом в проект добавился app.config (если не был до этого), видим в нем следующее:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsG roup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSetting sSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSe ttingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="ConsoleApplication3.MySettings" type="System.Configuration.ClientSetting sSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</sectionGroup>
</configSections>
<userSettings>
<ConsoleApplication3.MySettings>
<setting name="MyDate" serializeAs="String">
<value>2008-03-21</value>
</setting>
</ConsoleApplication3.MySettings>
</userSettings>
<applicationSettings>
<ConsoleApplication3.MySettings>
<setting name="MyString" serializeAs="String">
<value>какая то строка</value>
</setting>
</ConsoleApplication3.MySettings>
</applicationSettings>
</configuration>

Я думаю для тех, кто понимает xml - коментарии излишни

Теперь зайдем в класс дизайнера и видим следующие сгеренированные нам свойства:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[global::System.Configuration.UserScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("2008-03-21")]
        public global::System.DateTime MyDate {
            get {
                return ((global::System.DateTime)(this["MyDate"]));
            }
            set {
                this["MyDate"] = value;
            }
        }
        
        [global::System.Configuration.ApplicationScopedSettingAttribute()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("какая то строка")]
        public string MyString {
            get {
                return ((string)(this["MyString"]));
            }
        }
Видно, что свойство Application Scope - есть только get, то есть его можно только читать, а User scope - есть get и set - можно читать и писать.
Кроме этого видим установленные нами свойсва по умолчанию аттрибутами DefaultSettingValueAttribute. Хочу обратить внимание, что значения user scope свойств не хранятся в app.config, он не переписывается при вызове метода Save(), все данные хранятся в домашнем каталоге пользователя. Это значит что если в ОС есть пользователи Петя и Вася, они оба пользуются написанной нами программой - у них будут общие Default значения, а сохраненные значения User scope - у каждого свои.

Использование наших наработок:
C#
1
2
3
4
5
6
7
8
static void Main(string[] args)
        {
            MySettings settings = new MySettings(); //создаю с дефолтовыми значениями
            settings.Reload();  //перечитываю из конфига реальные
            string myStr = settings.MyString;   //достаю из конфига реальное значение
            settings.MyDate = DateTime.Now; //устанавливаю новое значение для User Scope
            settings.Save();    //сохраняю значения свойств User Scope
        }
- минимум усилий максимум скорости - красота, а текстовые файлы, ini и т д это неудобный велостпед + вчерашний день
3
 Аватар для dimasamchenko
336 / 269 / 21
Регистрация: 30.03.2009
Сообщений: 500
14.01.2010, 10:13
Доброго дня всем!
Благодарность FreeWay! Отличное описание!
Всем вопрос- как заставить файл инициализации(я имею ввиду стандартный settings) сохраняться в рабочей директории, там где находится exe?
0
 Аватар для FreeWay
84 / 84 / 19
Регистрация: 17.12.2007
Сообщений: 574
14.01.2010, 17:29
Цитата Сообщение от dimasamchenko Посмотреть сообщение
Доброго дня всем!
Благодарность FreeWay! Отличное описание!
Всем вопрос- как заставить файл инициализации(я имею ввиду стандартный settings) сохраняться в рабочей директории, там где находится exe?
а разве он там (вместе с экзешником) не формируеться???
Может ты CurrentDirectory меняешь?
0
 Аватар для Лакшми
61 / 50 / 1
Регистрация: 09.07.2009
Сообщений: 451
14.01.2010, 19:16
Если настройки для Application, то файл создастся в папке с файлом программы. А если для User, то в папке юзера Documents and Settings\<имя пользователя>\Application Data\<имя проекта>

Добавлено через 3 минуты
Цитата Сообщение от FreeWay Посмотреть сообщение
минимум усилий максимум скорости - красота, а текстовые файлы, ini и т д это неудобный велостпед + вчерашний день
Очень даже удобный велосипед! Пускай старый, но ездит все еще очень даже ничего. К тому же вполне надежный.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.01.2010, 19:16
Помогаю со студенческими работами здесь

Где хранить иконки для компонентов?
Хочу научить компонент прорисовывать иконки. Если упаковать его в jar, как их сохранить??

Как и где хранить настройки приложения
Есть WIN приложение, есть возможность указать в нем некоторые опции. Как обычно поступают? Создают класс опций а потом обращаются к...

Где в UWP хранить настройки приложения?
В WPF есть Setting.setting а в UWP нету в Properties

Где лучше хранить сведения о параметрах компонентов?
Разрабатывается IDE. Вопрос: сведения о параметрах компонентов лучше хранить в XML файле или разработать для этого иерархию классов, или и...

Где лучше всего хранить настройки приложения
Доброго времени суток. Пишу программу на Windows Forms. Нужно сохранять некие настройки программы. База работает с БД Access, но туда...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru