form

31
Form - Основа Win приложений Класс Form является основой для всех всех оконных пирложений и сегодня мы рассмотрим основные свойства этого класса, а точнее вашего класса наследованного от Form. Итак, когда вы создаете в VS Windows application проект, то автоматически создается класс (например Form1) наследованный от Form Это и есть контейнер для вашего приложения. Вот собственно то, что сгенерировала студия namespace WindowsApplication2 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } } В конструкторе класса, вызывается метод InitializeComponent() в нем будут инициализироваться все контролы данного окна, выставляться свойства и тд. Первоначальный запуск приложения как вы помните происходит из метода Main. В Win приложения метод Main находится в файле Program.cs, в Main происходит вызов нашего класса Form1 static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } Строка Application.EnableVisualStyles(); отвечает за наличие стилей XP у окна и его контролов Нажимаем Ctrl+F5 и запустится ваше первое оконное приложение.

Upload: kristina-kudinova

Post on 28-Nov-2014

117 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Form

Form - Основа Win приложений

Класс Form является основой для всех всех оконных пирложений и сегодня мы рассмотрим основные свойства этого класса, а точнее вашего класса наследованного от Form. Итак, когда вы создаете в VS Windows application проект, то автоматически создается класс (например Form1) наследованный от Form Это и есть контейнер для вашего приложения. Вот собственно то, что сгенерировала студия 

namespace WindowsApplication2 {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }     } } 

В конструкторе класса, вызывается метод InitializeComponent() в нем будут инициализироваться все контролы данного окна, выставляться свойства и тд. Первоначальный запуск приложения как вы помните происходит из метода Main. В Win приложения метод Main находится в файле Program.cs, в Main происходит вызов нашего класса Form1 

static void Main() {         Application.EnableVisualStyles();         Application.SetCompatibleTextRenderingDefault(false);         Application.Run(new Form1()); } 

Строка Application.EnableVisualStyles(); отвечает за наличие стилей XP у окна и его контролов 

Нажимаем Ctrl+F5 и запустится ваше первое оконное приложение. 

Теперь давайте посмотрим наиболее интересные свойства нашего окна. 

Page 2: Form

1. FormBorderStyle - Позволяет задавать рамку окна, а следовательно и его поведение, то есть фиксированный, растягиваемый и тд. 2. Text - Задает заголовок окна 3. MaximumSize и MinimumSize - задают соответственно максимальный и минимальный размер окна. 4. StartPosition - Задает позицию в которой будет первоначально формироваться окно. Например: CenterScreen или CenterParent 5. WindowState - позволяет задать состояние окна (свернутое или развернутое на весь экран) 6. Icon - Задает иконку для окна 7. MaximizeBox и MinimizeBox - позволяет скрыть кнопки управления состоянием окна (кнопки в правом верхнем углу окна) 8. Opacity - задает прозрачность окна 9. ShowIcon - Показывать или нет иконку 10. ShowInTaskBar - Показывать или нет окно в windows explorer 11. TopMost - Окно будет по верх остальных окон. 

Основные контролы Win приложений - Button

Окно само по себе это бесполезный класс и никакой пользы программисту а следовательно и пользователю не несет. Окно всего лишь контейнер для других более важных контролов управления. И в первой части мы рассмотрим Button откроем toolbox в разделе Common Controls найдем button и переместим на нашу форму 

Теперь рассмотри основные свойства кнопки 1. Text - Текст на кнопке 2. FlatStyle - определяет стиль кнопки 3. Enabled - В true кнопка доступна для нажатия 4. Visible - в false кнопка не отображается на форме, хотя она есть 5. TabInsex - определяет последовательность перехода на контрол по Tab-у 6. Dock - определяет заполнение одного из краев (или всех сразу) которое будет заполнять контрол, того контейнера в котором находится 7. Anchor - Определят какого края контейнера будет придерживаться контрол при растягивании формы 

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

Page 3: Form

Теперь о событиях: У кнопки есть целая куча событий, которые вы можите использовать, самое часто используемое это Click Что бы быстро обработать обработчик данного события необходимо дважды кликнуть по кнопке в окне дизайнера. Откроется метод в котором вы будите обрабатывать событие. 

Окунемся чуть глубже. Как обрабатываются события? Для этого необходимо в инициализации нашей кнопки определить делигат и указать ему метод который будет вызываться при возникновении данного события. Вот так: 

this.button1.Click += new System.EventHandler(this.button1_Click); 

Visual Studio автоматически вставляет данную строку в файл дизайнер, в нашем случае это Form1.Disigner.cs 

Теперь в обработчике вы можите например показать размер кнопки 

        private void button1_Click(object sender, EventArgs e)         {             MessageBox.Show(button1.Size.Width + " x " + button1.Size.Height);         } 

Основные контролы Win приложений - TextBox

Сегодня предметом нашего наблюдения будет текстовое поле или просто TextBox Основные свойства контролов мы рассматривали в предыдущем уроке и теперь будем рассматривать только уникальные свойства контролов. Итак, текстовое поле служит для ввода текста, иногда может использовать только для отображений. Свойства: 1. Text - Собственно строка введенного текста 2. CharacterCasing - возможность вводить только большие буквы или только строчные 3. MultiLine - Текстовое поле трансформируется в поле для ввода нескольких строк 4. PasswordChar - Если установлен какой либо символ, то поле маскирует ввод текста под пароль и текст скрывается под введенный символ (например звездочку) 5. ReadOnly - в true текстовое поле недоступно для редактиования. 

Page 4: Form

Событий так же целая масса: По умолчанию в студио выделен TextChanged - отрабатывает когда текст в поле изменен. Протестировать можно следующим образом. Добавляем на форму еще Label в текст будем выводить то что сейчас есть в нашем текстовом поле вот так 

private void textBox1_TextChanged(object sender, EventArgs e) {     label1.Text = textBox1.Text; } 

Основные контролы Win приложений - CheckBox

Сегодня предметом нашего наблюдения будет CheckBox CheckBox необходим для ответа ДА/НЕТ, хотя данный контрол в его настоящем имеет еще одно состояние - неопределенное. Свойства: 1. Text - Надпись рядом с крыжеком (галочкой). Обычно вопрос. 2. CheckState - Состояние контрола. (Отмечен/неотмечен/неопределено) 3. ThreeState - Указывает позволять или нет выбирать третье состояние (Неопределенное) 4. Checked - Возвращает true если контрол отмечен, false если не отмечен 

Основным событием является CheckedChanged - Отрабатывает когда изменено состояние контрола 

private void checkBox1_CheckedChanged(object sender, EventArgs e) {    MessageBox.Show(checkBox1.Checked.ToString()); } 

Надо отметить то, что если разрешено третье состояние то событие не отработает при выборе неопределенного 

Page 5: Form

Основные контролы Win приложений - RadioButton

Сегодня предметом нашего наблюдения будет RadioButton 

Радио кнопки позволяют сделать выбор между несколькими предложенными вариантами. Чтобы компилятор знал какие варианты ответа относятся к одному вопросу, радио кнопки объединяют в группу. 

Свойства: 1. Text - Вариант ответа 2. Checked - Возвращает true если контрол отмечен, false если не отмечен 

Если у вас на форме две группы ответов, то необходимо разносить их по разным контейнерам Я делаю это с помощью GroupBox 

Основным событием является CheckedChanged - Отрабатывает когда изменено состояние контрола 

К сожалению узнать одним махом выбранный контрол из группы не получится, (Хотя ребята из MicroSofta могли бы и сделать данный функционал ИМХО) придется перебрать свойство Checked у каждого контрола входящего в группу 

Основные контролы Win приложений - ComboBox

Page 6: Form

Сегодня предметом нашего наблюдения будет ComboBox 

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

Свойства: 1. Text - Надпись на контроле. Надо понимать что это не элемент списка а всего лишь первоначальная надпись. И при выборе одного из жлементов списка надпись больше не появится. 2. Sorted - Сортирует список 3. Items - Собственно сама коллекция 4. DropDownStyle - выбор стиля контрола 

Работа с элементами списка проходит через Items у которого есть методы 1. Add - Добавление элемента в список 2. Clear - Очищает список 3. Remove - Удаляет элемент списка 

Для примера заполним список числами от 0 до 100 

for (int i = 0; i < 100; i++)      comboBox1.Items.Add(i); 

Узнать выбранный элемент можно используя свойства SelectedItem, SelectedText, SelectedIndex 

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {    MessageBox.Show(comboBox1.SelectedItem.ToString()); } 

Данный код помещен в обработчик события SelectedIndexChanged который выполняется как только сменится элемент списка 

Page 7: Form

Выводим версию приложения

Для вывода версии приложения, её необходимо сначало установить. По умолчанию она 1.0.0.0 Установить текущую версию приложения можно в свойствах приложения 

А теперь в обработчике Load форы выведем текущую версию в заголовок окна 

        private void Form1_Load(object sender, EventArgs e) 

Page 8: Form

        {             this.Text += "    Version:  " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();         } 

Модальные окна

при создании класса наследника от Form возникает естественные потребности показать данное окно. Как вы знаете окно может быть как модальным так и обычным. Различие в том, что при модальном окне вы не сможите переключиться в другое окно пока данное (модальное) не закрыто. Для управлением показа существует у класса два метода 

Show() - Отображает обычное окно (переключение между окнами возможно) ShowDialog() - Отображает диалоговое (модальное) окно (переключение между окнами

не возможно)

Передача параметров между окнами

Рассмотри пример передачи параметров из child окна в родительское. Плюс к нашей основной форме создадим небольшое окно с текстовым полем и кнопкой. Кнопке установим свойство DialogResult OK, это будет означать, что при нажатии данной кнопки окно вернет DialogRegult == OK что и будет событием для отображения параметра введенную в дочернюю форму. 

Чтобы в родительском окне было видно текстовое поле дочернего, установим модификатор у текстового поля в Public 

Итак на главной форме в обработчики какого либо события (по которому будем показывать дочернее окно) создаем нашу вторую форму и отображаем ее 

Form2 window = new Form2(); window.ShowDialog(); 

Далее обрабатываем события нажатия нашей OK кнопки и показываем параметр (введенный текст) в родительском окне 

            if (window.DialogResult == DialogResult.OK)                 MessageBox.Show(window.textBox1.Text); 

Маска ввода

Page 9: Form

Часто хочется от пользователя добиться правильного ввода данных. Для облегчения данной задачи в .NET 2.0 создали специальный контрол - MasketTextBox. Он позволяет вводить текст по заранее заданному шаблону. Давайте добавим на форму этот компонент и создадим шаблон для ввода IP адреса. 

IP адрес состоит из 4 групп (v. IP4) разделенных точками. Цифры отображаем нулями. Разделители точками. Нижнее поле показывает как будет отображаться контрол до ввода данных. 

А вот контрол в действии 

Отображение ошибок - ErrorProvider

В .NET 2.0 существует компонент, который позволяет привлечь пользователя к какому либо критическому участку (выполнения действия или заполнения формы) - ErrorProvider 

Возвращаясь к предыдущему уроку, используя masketTextBox нельзя проконтролировать диапозон введенных цифр. Давайте на кнопку, выполняющую действие, с введенным IP повесим проверку IP и покажем ошибку если он не валидный 

        private void button1_Click(object sender, EventArgs e)         {             // проверка IP             // ........... 

Page 10: Form

            //------------             errorProvider1.SetError(maskedTextBox1, "Не верный IP");                      } 

Метод SetError зажигает ошибку, передавая в качестве параметра, к какому контролу привязаться и текст ошибки 

У провайдера имеются множество свойства позволяющих настраивать отображение: иконки, блинки, и тд 

Достучаться до реестра

Для работы с реестром в .NET используется пространство имен System.Microsoft.Win32 класс Regestry Узнаем производителя процессора. Для этого при создании класса ключа реестра укажем корневую ветку 

Microsoft.Win32.RegistryKey myRegKey = Microsoft.Win32.Registry.LocalMachine; 

Далее указываем полный путь до необходимого ключа 

myRegKey = myRegKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"); 

Берем значение параметра и выводим его 

Object oValue = myRegKey.GetValue("VendorIdentifier"); MessageBox.Show("The central processor of this machine is "+ oValue.ToString()); 

Достучаться до служб

Page 11: Form

В .NET имеется пространство имен ServiceProcess которое позволяет через класс ServiceController работать со службами имеющимися на данном компьютере. 

Итак давайте получим список сервисов имеющихся на компьютере. 

Для этого воспользуемся методом GetDevices() класс ServiceController. Не забудьте сделать референс на сборку System.ServiceProcess и добавить это пространство имен 

using System.ServiceProcess; 

Выводим все сервисы 

            string services = "";             foreach (ServiceController sc in ServiceController.GetDevices())             {                 services += sc.DisplayName + "\n";             }             MessageBox.Show(services); 

Компановка элементов

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

Page 12: Form

Для того, чтобы грид растягивался во все стороны необходимо привязать его ко всем сторонам формы, выставив свойство Anchor в Top, Bottom, Left, Right 

Что бы грид не налазил на кнопку при увеличении, необходимо изменить anchor для кнопки на значение Bottom, Left Теперь при растяжении растягивется грид, а кнопка следует вниз за нижней границей формы 

Считываем нажатую клавишу

Посмотрим как можно распознать нажатую кнопку на форме. 

Для этого нам надо подписаться на событие KeyPress нашей формы 

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 

В сгенерившейся функции передаются аргументы связанные с нажатой кнопкой 

Добавим вывод нажатой кнопки в метку на форме 

label1.Text = e.KeyChar.ToString(); 

Page 13: Form

Создаем DLL

Сегодня будем создавать динамическую библиотеку DLL. На самом деле DLL это тот же исполняемый код, только в нем нет Main и вызов методов происходит из вашей exe сборки. Плюсом является то, что в память DLL загружается только при вызове методов находящихся в ней. 

ИТак, создаем проект 

В классе создадим метод который будет возвращать текущий день недели 

using System; using System.Collections.Generic; using System.Text; 

namespace ClassLibrary1 {     public class Class1     { 

        public static string Today()         {             return DateTime.Now.DayOfWeek.ToString();         }     } } 

Page 14: Form

Компилируем DLL, нажав ctrl+shift+B 

Используем DLL

Сегодня будем прикручивать DLL созданную на прошлом уроке. 

Кликаем правой кнопкой мыши по проекту в окне SolutionExplorer Нажимаем Add Reference 

Ищем нашу DLL и добавляем ее в проект 

После этих действий пространство имен ClassLibrary1 и класс Class1 будут видны в нашем проекте Вызовем единственный метод класса 

MessageBox.Show(ClassLibrary1.Class1.Today()); 

Результат на экране 

Выбираем цвет

Page 15: Form

В .NET существует целый ряд диалоговых окон, сегодня мы рассмотрим ColorDialog 

На примере мы будем разукрашивать надпись в Label цветом выбранным в диалоговом окне. 

Создаем colorDialog и бросаем его на форму. При нажатие на кнопке открываем диалог цветов. 

При положительном выборе цвета в диалоговом окне, назначаем этот цвет метке 

        private void button1_Click_1(object sender, EventArgs e)         {             DialogResult dr = colorDialog1.ShowDialog();             if (dr == DialogResult.OK)                 label1.ForeColor = colorDialog1.Color;         } 

Файловый диалог

Еще одним из примеров диалогов является файловый выбор - OpenFileDialog Позволяет выбрать файл из имеющихся на компьютере. 

Кидаем компонент на форму. Для вывода полного пути до файла разместим textbox. На кнопку вешаем открытие формы и обработку DialogResult 

        private void button1_Click_1(object sender, EventArgs e)         {             DialogResult dr = openFileDialog1.ShowDialog();             if (dr == DialogResult.OK)                 textBox1.Text = openFileDialog1.FileName;         } 

Page 16: Form

OpenFileDialog имеет большое количество полезных свойств, позволяющие тонко настроить данный компонент 

Title - задает заголовок окна Filter - Позволяет фильтровать файлы по расширению (C# файлы|*.cs) MultiSeelct - Позволяет выбирать несколько файлов initialDirectory - Начальный каталог

Создаем броузер

К нашему счастью веб броузер уже есть - это компонент WebBrowser Остается только добавить пару дополнительных контролов, что бы мы могли перемещаться по интернету вводя URL. 

Добавляем текстовое поле, в которое будем вводить URL. Добавляем кнопку и используем метод Navigate для отображения в броузере 

        private void button1_Click_1(object sender, EventArgs e)         {             webBrowser1.Navigate("http://"+textBox1.Text);         } 

Наш первый броузер готов 

Page 17: Form

Динамическое создание дерева - TreeView

Что бы рассмотреть работу с деревом (компонент TreeView), предлагаю начитать структуру двух первых уровней каталогов вашего диска С Для этого нам потребуется класс DirectoryInfo из пространства имен System.IO Используя метод GetDirectoties мы получим список каталогов, далее будем рекурсивно добавлять узлы в дерево используя метод Add 

            DirectoryInfo di = new DirectoryInfo(@"c:\");             foreach (DirectoryInfo di2 in di.GetDirectories())             {                 TreeNode tn = new TreeNode(di2.Name);                 DirectoryInfo d3 = new DirectoryInfo(di2.FullName);                 foreach (DirectoryInfo d4 in d3.GetDirectories())                 {                     tn.Nodes.Add(new TreeNode(d4.Name));                 }                 treeView1.Nodes.Add(tn);             } 

Мини explorer первых двух уровней вложенности диска C готов 

Page 18: Form

Окна родитель и потомок

Для получения вложенной структуры окон (например как в Wopd'e) Необходимо в родительском окне указать свойство IsMDIcontainer = true 

Чтобы все окна открываем из него отображались как вложенные, необходимо у создаваемых окон указать в свойстве MdiParent родительское окно 

            Form2 w = new Form2();             w.MdiParent = this;             w.Show(); 

Page 19: Form

Управляем форматом даты

По умолчанию все настройки отображения даты, время, разделителей дробных чисел берутся из региональных настроек Windows. Для переопределения отображения даты создадим класс DateTimeFormatInfo из пространства имен System.Globalization и настроим его свойство ShortDatePattern в тот формат который нам нужен. 

            MessageBox.Show(DateTime.Now.ToString());             System.Globalization.DateTimeFormatInfo dtfi = new System.Globalization.DateTimeFormatInfo();             dtfi.ShortDatePattern = "yyyy-MM-dd";             MessageBox.Show(DateTime.Now.ToString(dtfi)); 

Еще про региональные параметры

При попытке выполнить преобразование строки в double следующей командой 

Convert.ToDouble("2.5"); 

На русской винде в процессе выполнения вылетит ошибка о несоответствии формата. Дело в том что при преобразовании берутся региональные настройки, а для России в качестве разделителя целой и дробной части по умолчанию запятая, а в тексте точка. Для корректного преобразования необходимо передать провайдер формата. Класс NumberFormatInfo служит как раз для этого 

            System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo();             nfi.NumberDecimalSeparator = ".";             Convert.ToDouble("2.5", nfi); 

Рисуем на форме

В нет рисование происходит через GDI+. Для примера нарисуем на нашей форме круг, используя класс Graphics и метод DrawEllipse 

Page 20: Form

            Graphics g = Graphics.FromHwnd(this.Handle);             g.DrawEllipse(new Pen(Color.Green), 100, 100, 30, 30); 

В качестве параметров методу передаются: объект карандаш, координаты расположения и размер по вертикали и горизонтали. 

Языковая кастомизация

Как уже говорилось ранее большинство настроек адаптации по территории и тд берутся из региональных параметров. Однако вы можите управлять ими. В .NET Контролы могут хранить текст в нескольких языках. Вот как это делается из Студии на примере метки Label 

У формы на которой будет использоваться мультиланг устанавливаем у свойства Language язык - русский 

Пишем свойство метки Text - "Пример" 

Меняем Language у формы на английский , далее у метки Text на "Example" 

Теперь запустим программу, если у вас русская винда то вы увидите следующее 

далее давайте в конструкторе формы поменяем язык для UserInterface на английский и посмотри что будет написано в метке 

        public Form1()         {             System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");             InitializeComponent();         } 

Page 21: Form

Прикручиваем контекстное меню

Сегодня мы рассмотрим как прикрутить контекстное меню к одному из контролов, а именно к метке Label. Необходимо на форме разместить комнонент ContextMenuStrip. Добавляем в него два два пункта "Enabled" и "Disabled" 

В свойстве contextMenuStrip у метки указываем имя нашего меню. после таких манипуляций при щелчке правой кнопкой по Label покажется наше меню с двумя пунктами. 

Построим обработчик для каждого пункта, по щелчке по которому будет меняться текст у метки 

        private void enabledToolStripMenuItem_Click(object sender, EventArgs e)         {             label1.Text = "Enabled";         } 

        private void disabledToolStripMenuItem_Click(object sender, EventArgs e) 

Page 22: Form

        {             label1.Text = "Disabled";         } 

Значок в трее

Для того чтобы ваша программа отражалась в трее существует компонент NotifyIcon Для отображения в трее необходимо указать иконку для отображения в свойстве Icon 

Одной из привлекательных возможность данного компонента является возможность показывать всплывающие уведомления в области трея. Для этого используется метод ShowBalloonTip. В качестве параметров принимает время в милисекундах на которое покажется подсказка, заголовок, текст и иконка уведомления 

notifyIcon1.ShowBalloonTip(5000, "Title", "Text", ToolTipIcon.Info); 

Отображаем ход процесса

Для наглядного отображения хода выполнения длительной операции применяется ProgressBar Основными свойствами является нижний и верхний предел допустимых значений - Minimum и Maximum. Value содержит текущее значение прогресс бара. 

Page 23: Form

Также можно задать стиль отображения контрола в свойстве Style. На примере покажем как прокрутить прогресс бар от 0 до 100 

            for (int i = progressBar1.Minimum; i < progressBar1.Maximum; i++)             {                 progressBar1.Value = i;                 System.Threading.Thread.Sleep(10);             } 

Строка состояния

Для вывода информации в строке состояния необходимо установить контрол StatusStrip На самом деле этот компонент - контейнер и может кроме тектовой строки отображать также прогрессбар, splitbutton, dropdownbutton 

Выберите необходимый элемент для отображения (ндопустим toolStripStatusLabel) Для вывода информации в него используется свойство Text 

toolStripStatusLabel1.Text = "Нажата кнопка"; 

Page 24: Form

Таймер

Timer используется для запуска каких либо действий через определенное время Для задания времени срабатывания используется свойство interval 

Существует единственно событие Tick которое отрабатывает через время заданное в Interval 

Можно временно выключать таймер переводя свойство enable в false 

        private void timer1_Tick(object sender, EventArgs e)         {             label1.Text = DateTime.Now.ToString();         } 

Работа с конфигом

Page 25: Form

В данном уроке мы рассмотри механизм работы с конфигурационными файлами в WIN приложениях.

Для начала добавляем в проект конфиг файл 

Будет создан файл в XML формате

Подключаем библиотеку 

using System.Configuration; 

Создаем объект через который будем взаимодействовать с файлом конфигурации 

System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

Выбираем секцию конфиг файла 

AppSettingsSection appSettings = (AppSettingsSection)config.GetSection("appSettings"); 

Вот пример моего файла конфигурации 

Page 26: Form

Когда секция подключена можно читать и сохранять параметры 

Читаем параметры конфиг файла 

MessageBox.Show(appSettings.Settings["server"].Value); 

Записываем новое значение

appSettings.Settings["server"].Value = "NewServer"; 

После внесения новых значений необходимо сохранить конфиг

config.Save(); 

Как свернуть окно в трей

Итак, для того чтобы свернуть окно в трей нам потребуется элемент NotifyIcon 

Page 27: Form

Выбираем элемент и размещаем его на форме Свойство Visible поставьте в false чтобы при загрузке приложения иконка не отображалась в трее и выберите иконку для отображения 

Итак за сворачивание окна отвечает событие Deactivate Проверяем состояние окна, если оно действительно свернуто, то скрываем его из области отображения в эксплорере и показываем нашу иконку в трее 

        private void Form1_Deactivate(object sender, EventArgs e)         {             if (this.WindowState == FormWindowState.Minimized)             {                 this.ShowInTaskbar = false;                 notifyIcon1.Visible = true;             } 

        } 

Page 28: Form

Восстановить окно можно по событию клика по иконке, либо можно привязать контекстное меню так как показано в уроке Контекстное меню 

        private void notifyIcon1_Click(object sender, EventArgs e)         {             if (this.WindowState == FormWindowState.Minimized)             {                 this.WindowState = FormWindowState.Normal;                 this.ShowInTaskbar = true;                 notifyIcon1.Visible = false;             } 

        }