Как сохранить настройки приложения в другое место и имя файла - PullRequest
1 голос
/ 22 февраля 2020

C# Windows Формы.

Я успешно использовал Настройки приложения, чтобы сохранить и загрузить пользовательские настройки для значений элементов управления в моей форме. У меня есть флажок и код, где я могу установить, происходит ли это автоматически (при запуске и закрытии приложения) или нет. У меня также есть меню, чтобы я мог загрузить их и сохранить их во время выполнения. Все это использует user.config по умолчанию.

Пример. В настройках приложения у меня есть (для одного из элементов, который является переключателем RbBitRate6Mbps):

Имя: BitRate6Mbps

Тип: String

Область действия: пользователь

Значение: False

Для сохранения настроек у меня есть пункт меню, Сохранить значения по умолчанию . Это работает:

if (RbBitRate6Mbps.Checked == true)
{
    Settings.Default["BitRate6Mbps"] = "True";
}

else
{
    Settings.Default["BitRate6Mbps"] = "False";
}

Settings.Default.Save();

Чтобы загрузить настройки обратно, у меня есть пункт меню, Загрузить значения по умолчанию . Это запускается:

if (Settings.Default["BitRate6Mbps"].ToString() == "True")
{
    RbBitRate6Mbps.Checked = true;
}

else
{
    RbBitRate6Mbps.Checked = false;
}

Существует около 10 других элементов управления, которые я сохраняю и загружаю (текстовые поля, флажки и переключатели), в остальном коде выше. Все это работает без проблем.

Теперь я хотел бы иметь несколько наборов этих настроек, каждый из которых будет содержать несколько одинаковых значений и несколько разных. Каждый из них будет иметь свое имя и сохраняться в собственном месте (по умолчанию это папка приложения). Я не против, в каком формате файл (xml, ini, et c), но если он такой же, как по умолчанию, это было бы хорошо.

Я создал новые пункты меню, Сохранить пользовательские настройки и Загрузить пользовательские настройки .

Я добавил SaveFileDialog и LoadFileDialog, которые, будем надеяться, будут использоваться для вышеуказанного. Но если в этом нет необходимости, это тоже хорошо.

Вот где я застрял.

Я искал несколько дней, чтобы найти четкий пример того, как это сделать. Я не смог найти много. Что я обнаружил, я не смог понять документацию.

Я думаю, что загрузка настроек обратно будет более легкой частью? Но я также думаю, что для сохранения файла, используя:

Settings.Default.Save();

Не достигнет sh моих целей, так как он будет просто записывать в файл user.config по умолчанию?

Что Я хочу сделать возможным?

Если да, у кого-нибудь есть какие-либо инструкции и пример кода?

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Обновление. Я установил новый поставщик настроек , и он работает хорошо. Сохраняет XML в папке приложения. Я также настроил INI-файлы для сохранения настроек. Использование как пользовательского пути, так и пользовательского имени файла. Это позволяет создавать несколько файлов INI. Это также работает очень хорошо.

Редактировать: Обновлен код (и инструкции), поэтому больше нет необходимости создавать какие-либо пользовательские папки вручную. Если он не существует, он будет создан.

Проект разработчика XML разработчиков находится здесь:

Поставщики настроек на Github

Проект разработчиков файлов INI (и демонстрационная версия) находится здесь:

C# Демонстрационная версия WinForms Ini File на Github

Ниже приведены инструкции по настройке нового провайдера настроек с файлом XML и последующие инструкции по сохранению настроек в INI-файлах (оба типа могут использоваться в одном проекте одновременно, так как я делаю здесь):

Использование нового поставщика настроек для сохранения настроек в файле XML:

1. Установите Настройки приложения Solution Explorer , щелкните правой кнопкой мыши приложение. Затем выберите: Свойства . Затем откройте: Настройки ) .

Name: txtFullName
Type: String
Scope: User
Value: John Doe

Name: txtSchool
Type: String
Scope: User
Value: Oxford

Name: txtClass
Type: String
Scope: User
Value: 4B

Name: chkActiveStudent
Type: bool
Scope: User
Value: True

2. Установите из NuGet нового поставщика настроек Solution Explorer щелкните правой кнопкой мыши: Ссылки . Затем выберите: Управление пакетами NuGet Затем выполните поиск: PortableSettingsProvider . Установите его.

3. В Program.cs изменить stati c void Main () . Добавьте к этому строки ниже.

//PortableSettingsProvider.SettingsFileName = "portable.config";
//PortableSettingsProvider.SettingsDirectory = "c:\\\testconfig\\\school";
//System.IO.Directory.CreateDirectory(PortableSettingsProvider.SettingsDirectory);
PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);

Если принять настройки по умолчанию (файл конфигурации, portable.config , будет создан в папке приложений), правильно отредактированный stati c void Main () запись будет выглядеть следующим образом.

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);        
    //PortableSettingsProvider.SettingsFileName = "portable.config";
    //PortableSettingsProvider.SettingsDirectory = "c:\\testconfig\\school";
    //System.IO.Directory.CreateDirectory(PortableSettingsProvider.SettingsDirectory);
    PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);            
    Application.Run(new MyTestApp());
}

3a. Чтобы выбрать другое имя файла и местоположение, удалите комментарии (//) и измените свои предпочтения для имени файла и местоположения (двойные косые черты необходимы между именами папок). В этом примере я использую settings.config в качестве имени файла и c: \ testconfig \ school в качестве пути). В этом случае правильно отредактированная запись stati c void Main () будет выглядеть следующим образом.

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);        
    PortableSettingsProvider.SettingsFileName = "settings.config";
    PortableSettingsProvider.SettingsDirectory = "c:\\testconfig\\school";
    System.IO.Directory.CreateDirectory(PortableSettingsProvider.SettingsDirectory);
    PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);            
    Application.Run(new MyTestApp());
}

3b. Если вы хотите, чтобы каталог настроек создавался в подпапке рабочего каталога приложений, измените код, включив в него имя подпапки (в этом примере я использую settings.config в качестве имени файла и Настройки как подпапка). В этом случае правильно отредактированная запись stati c void Main () будет выглядеть следующим образом.

static void Main()
{
    Application.EnableVisualStyles();        
    PortableSettingsProvider.SettingsFileName = "settings.config";
    var strSettingsDirectory = Directory.GetCurrentDirectory() + "\\Settings";
    System.IO.Directory.CreateDirectory(strSettingsDirectory);
    PortableSettingsProvider.SettingsDirectory = strSettingsDirectory;
    PortableSettingsProvider.ApplyProvider(Properties.Settings.Default);
    Application.Run(new MyTestApp());
}

4. Все еще в Program.cs , добавьте следующую строку в конец существующего , используя раздел .

using Bluegrams.Application;

5. В форме создайте несколько элементов управления (они будут соответствовать Настройки приложения , выполненным на шаге 1).

TextBox. Name: txtFullName

TextBox. Name: txtSchool

Textbox. Name: txtClass

Checkbox. Name: chkActiveStudent

Button. Name: btnLoadSettings  Text: Load Config

Button. Name: btnSaveSettings  Text: Save Config

6. Введите код для событий нажатия кнопок Load Config ( btnLoadSettings ).

private void btnLoadSettings_Click(object sender, EventArgs e)
{
    txtName.Text = Properties.Settings.Default.txtName.ToString();
    txtSchool.Text = Properties.Settings.Default.txtSchool.ToString();
    txtClass.Text = Properties.Settings.Default.txtClass.ToString();

    if (Properties.Settings.Default.chkActiveStudent == true)
    {
        chkActiveStudent.Checked = true;
    }
    else
    {
        chkActiveStudent.Checked = false;
    }
}

7. Введите код для событий нажатия кнопок Сохранить конфигурацию ( btnSaveSettings ).

private void btnSaveSettings_Click(object sender, EventArgs e)
{
    Properties.Settings.Default.txtName = txtName.Text;
    Properties.Settings.Default.txtSchool = txtSchool.Text;
    Properties.Settings.Default.txtClass = txtClass.Text;

    if (chkActiveStudent.Checked == true)
    {
        Properties.Settings.Default.chkActiveStudent = true;
    }

    else
    {
        Properties.Settings.Default.chkActiveStudent = false;
    }

    Properties.Settings.Default.Save();
}

8. Вот и все.

Запустите приложение. Загрузите настройки с помощью первой кнопки). Внесите некоторые изменения в текст на элементах управления. Сохраните их, используя вторую кнопку.

Если вы не создали пользовательское имя файла и / или путь, то в папке вашего приложения должен появиться новый файл: portable.config .

Шахта находится по адресу: C: \ Users \ flakie \ source \ repos \ TestApp \ TestApp \ bin \ Debug

Файл можно открыть в формате txt / * Редактор 1218 * для проверки установки значений.

Если вы снова запустите приложение и загрузите настройки, вы должны увидеть новые значения.

Код для сохранения настроек в нескольких INI-файлах

Следующие инструкции проще выполнить. Они не требуют от вас установки Настройки приложения , поскольку они не используются. Настройки будут сохранены в 1 или более файлах INI.

Путь может быть изменен на лету (хотя установлено значение по умолчанию), как и имя файла для файла INI.

Снова будет использоваться собственная папка приложений в качестве места назначения по умолчанию (для файлов INI).

Вам потребуется изменить только файл Form.cs .

Демонстрацию (по ссылке выше) легко понять, и ее было достаточно, чтобы предоставить мне знания для создания этого примера (а я C# новичок).

9. Установите из NuGet пакет файлов INI (в Solution Explorer , щелкните правой кнопкой мыши: Ссылки . Затем выберите: Управление пакетами NuGet . Затем выполните поиск: PeanutButter.INI . Установите его.

10. В вашем файле Form.cs ( Form1.cs , если вы не изменили имя), добавьте следующую строку в конец существующего , используя раздел .

using PeanutButter.INIFile;

11. В вашем файле Form.cs прямо под строкой publi c частичный класс Form1: Form добавьте следующую единственную строку кода.

private IINIFile _loadedConfig;

Это должно выглядеть следующим образом.

public partial class Form1 : Form    {

    private IINIFile _loadedConfig;

12. На форме создайте еще две кнопки.

Button. Name: btnOpenIniFile  Text: Open INI

Button. Name: btnSaveIniFile  Text: Save INI

13. Введите код для события нажатия кнопки Open INI ( btnOpenIniFile ).

private void btnOpenIniFile_Click(object sender, EventArgs e) {        

    using(OpenFileDialog OpenFileIni = new OpenFileDialog()) {
        var strSettingsDirectory = Directory.GetCurrentDirectory() + "\\Settings";
        System.IO.Directory.CreateDirectory(strSettingsDirectory);
        OpenFileIni.InitialDirectory = strSettingsDirectory;
        OpenFileIni.Filter = "INI File|*.ini";
        OpenFileIni.RestoreDirectory = true;
        OpenFileIni.CheckFileExists = true;
        OpenFileIni.CheckPathExists = true;
        OpenFileIni.Title = "Open an INI Settings File";

        if (OpenFileIni.ShowDialog() == DialogResult.OK)
        {
            _loadedConfig = new INIFile(OpenFileIni.FileName);    
            txtName.Text = _loadedConfig.HasSetting("UserSettings", "txtName") ? _loadedConfig["UserSettings"]["txtName"] : "";    
            txtSchool.Text = _loadedConfig.HasSetting("UserSettings", "txtSchool") ? _loadedConfig["UserSettings"]["txtSchool"] : "";    
            txtClass.Text = _loadedConfig.HasSetting("UserSettings", "txtClass") ? _loadedConfig["UserSettings"]["txtClass"] : "";

            if (_loadedConfig["UserSettings"]["chkActiveStudent"] == "Checked")
            {
                chkActiveStudent.Checked = true;
            }
            else
            {
                chkActiveStudent.Checked = false;
            }
        }
    }
}

14. Введите код для события нажатия кнопки Сохранить INI ( btnSaveIniFile ).

private void btnSaveIniFile_Click(object sender, EventArgs e)
{
    using (SaveFileDialog SaveFileIni = new SaveFileDialog())
    {
        var strSettingsDirectory = Directory.GetCurrentDirectory() + "\\Settings";
        System.IO.Directory.CreateDirectory(strSettingsDirectory);
        SaveFileIni.InitialDirectory = strSettingsDirectory;
        SaveFileIni.Filter = "INI File|*.ini";
        SaveFileIni.Title = "Save an INI Settings File";

        if (SaveFileIni.ShowDialog() == DialogResult.OK)
        {
            _loadedConfig = new INIFile(SaveFileIni.FileName);
            _loadedConfig["UserSettings"]["txtName"] = txtName.Text;
            _loadedConfig["UserSettings"]["txtSchool"] = txtSchool.Text;
            _loadedConfig["UserSettings"]["txtClass"] = txtClass.Text;

            if (chkActiveStudent.Checked == true)
            {
                _loadedConfig["UserSettings"]["chkActiveStudent"] = "Checked";
            }
            else
            {
                _loadedConfig["UserSettings"]["chkActiveStudent"] = "UnChecked";
            }

            _loadedConfig.Persist();
        }
    }
}

15. Вот и все. Запустите приложение.

Внесите некоторые изменения в текст в элементах управления текстового поля. Сохраните их, используя кнопку Сохранить INI .

Вам будет предложено ввести имя файла. Это может быть все что угодно (но в этом примере я использовал имя человека, которого я настроил в первом текстовом поле. Вам не нужно вводить расширение файла INI. Вы можете изменить местоположение, если вы будете sh.

Внесите еще некоторые изменения в текстовые поля, но , а не сохраните их. Нажмите кнопку Открыть INI . Найдите файл INI, который вы только что сохранили, и откройте его .

Текст, который вы только что изменили без сохранения, теперь должен быть заменен текстом, который вы сохранили в INI-файле.

0 голосов
/ 22 февраля 2020

Используйте функцию OpenExeConfiguration, чтобы прочитать настройки, а затем добавить / обновить значения ключа до того, как Save вернет его. Наконец, вы можете ConfigurationManager.RefreshSection обновить sh настроек определенного раздела.

Пример на Ссылка

static void AddUpdateAppSettings(string key, string value)  
{  
    try  
    {  
        var configFile = ConfigurationManager
                          .OpenExeConfiguration(ConfigurationUserLevel.None);  
        var settings = configFile.AppSettings.Settings;  
        if (settings[key] == null)  
        {  
            settings.Add(key, value);  
        }  
        else  
        {  
            settings[key].Value = value;  
        }  
        configFile.Save(ConfigurationSaveMode.Modified);  
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);  
    }  
    catch (ConfigurationErrorsException)  
    {  
        Console.WriteLine("Error writing app settings");  
    }  
} 
...