Кратко съдържание

Том 2

Кратко съдържание. 2

Съдържание. 13

Предговор към втория том. 33

Глава 15. Изграждане на графичен потребителски интерфейс с Windows Forms  55

Глава 16. Изграждане на уеб приложения с ASP.NET. 173

Глава 17. Многонишково програмиране и синхронизация. 283

Глава 18. Мрежово и Интернет програмиране. 349

Глава 19. Отражение на типовете (Reflection). 431

Глава 20. Сериализация на данни. 459

Глава 21. Уеб услуги с ASP.NET. 501

Глава 22. Отдалечени извиквания с .NET Remoting. 587

Глава 23. Взаимодействие с неуправляван код. 631

Глава 24. Управление на паметта и ресурсите. 675

Глава 25. Асемблита и разпространение. 747

Глава 26. Сигурност в .NET Framework. 815

Глава 27. Mono – свободна имплементация на .NET Framework. 863

Глава 28. Помощни инструменти за .NET разработчици. 909

Глава 29. Практически проект. 971

Заключение към втория том. 1031

 


Програмиране за .NET Framework

 

Светлин Наков и колектив

 

 


Александър Русев

Александър Хаджикръстев

Антон Андреев

Бранимир Ангелов

Васил Бакалов

Виктор Живков

Галин Илиев

Георги Пенчев

Деян Варчев

Димитър Бонев

Димитър Канев

Ивайло Димов

Ивайло Христов

Иван Митев

Лазар Кирчев

Манол Донев

Мартин Кулов

Михаил Стойнов

Моника Алексиева

Николай Недялков

Панайот Добриков

Преслав Наков

Радослав Иванов

Рослан Борисов

Светлин Наков

Стефан Добрев

Стефан Захариев

Стефан Кирязов

Стоян Дамов

Тодор Колев

Христо Дешев

Христо Радков

Цветелин Андреев

Явор Ташев


 

 

 

Българска асоциация на разработчиците на софтуер

София, 2004-2006


Програмиране за .NET Framework (том 2)

 

© Българска асоциация на разработчиците на софтуер (БАРС), 2006 г.

 

Настоящата книга се разпространява свободно при следните условия:

Читателите имат право:

-        да използват книгата и учебните материали към нея или части от тях за всякакви цели, включително да ги да променят според своите нужди и да ги използват при извършване на комерсиална дейност;

-        да използват сорс кода от примерите и демонстрациите, включени към книгата и учебните материали или техни модификации, за всякакви нужди, включително и в комерсиални софтуерни продукти;

-        да разпространяват безплатно непроменени копия на книгата и учеб­ните материали в електронен или хартиен вид;

-        да разпространяват безплатно оригинални или променени части от учебните материали, но само при изричното споменаване на източника и авторите на съответния текст, програмен код или друг материал.

Читателите нямат право:

-        да разпространяват срещу заплащане книгата, учебните матери­али или части от тях (включително модифицирани версии), като изключе­ние прави само програмният код;

-        да премахват настоящия лиценз от книгата или учебните материали.

 

Всички запазени марки, използвани в тази книга, са собственост на техните притежатели.

 

 

Официален уеб сайт:

www.devbg.org/dotnetbook/

 

ISBN: 954-775-672-9

ISBN: 978-954-775-672-4


Национална академия по разработка на софтуер

Лекторите

» Светлин Наков е автор на десетки технически публи­ка­ции и ня­колко книги, свър­­зани с раз­работката на соф­ту­ер, заради което е тър­сен лектор и кон­султант.

Той е разработчик с дъл­гого­дишен опит, работил по раз­нообразни проекти, реали­зи­рани с раз­лични техноло­гии (.NET, Java, Oracle, PKI и др.) и преподавател по съвре­мен­ни софтуерни технологии в СУ "Св. Климент Охридски".

През 2004 г. е носител на награ­дата "Джон Атанасов" на прези­дента на България Ге­орги Пър­ва­нов.

Светлин Наков ръководи обу­чението по Java технологии в Академията.

 

» Мартин Кулов е софтуерен инженер и консул­тант с дългогодишен опит в изграждането на решения с платформите на Microsoft.

Мартин е опитен инструктор и сертифициран от Майкрософт разработчик по програмите MCSD, MCSD.NET, MCPD и MVP и меж­дународен лектор в световна­та организа­ция на .NET потре­бителски­те групи INETA.

Мартин Кулов ръководи обу­чението по .NET технологии в Академията.

Академията

» Национална академия по раз­ра­ботка на софтуер (НАРС) е център за професионално обу­чение на соф­ту­ерни специалисти.

 

» НАРС провежда БЕЗПЛАТНО кур­сове по разработка на софтуер и съв­ременни софтуерни тех­нологии в Со­фия и други градове.

 

» Предлагани специалности:

§      Въведение в програмирането (с езиците C# и Java)

§      Core .NET Developer

§      Core Java Developer

 

» Качествено обу­чение с много практически про­екти и индивиду­ално внимание за всеки.

 

» Гарантирана работа! Трудов до­говор при постъпване в Академията.

 

» БЕЗПЛАТНО!

Учите безплатно във въведителните курсове и по стипендии от работода­телите в следващите нива.

http://academy.devbg.org




 

 

 


 

 

www.devbg.org

 

 

Българска асоциация на разработчиците на софтуер (БАРС) е нестопанска организация, която подпомага про­фе­сионалното развитие на българските софтуерни специ­а­листи чрез образо­вателни и други инициативи.

БАРС работи за насърчаване обмяната на опит между раз­работ­чиците и за усъвършенстване на техните знания и умения в областта на проектирането и разработката на софтуер.

Асоциацията организира специализирани конференции, семи­нари и курсове за обучение по разработка на софту­ер и софту­ерни технологии.

БАРС организира създаването на Национална академия по раз­работка на софтуер – учебен център за професионал­на подго­товка на софтуерни специалисти.

 


Отзив от Теодор Милев

 

Свидетели сме как платформата Microsoft .NET се налага все повече в света на софтуерните технологии. Тази тенденция се наблюдава и в България, където прогресивно нараства броят на проектите, реализирани на базата на .NET. С увеличаване на .NET разработчиците расте и нуждата от качествена техническа литература и учебни материали, които да бъдат използвани при обучението на .NET специалисти.

"Програмиране за .NET Framework" е първата чисто българска книга за Microsoft .NET технологиите. Тя представя на читателя в последователен, структуриран, достъпен и разбираем вид основните концепции за разра­ботка на приложения с .NET Framework и езика C#. Книгата обхваща в детайли всички основни .NET технологии като набляга върху най-важните от тях – ADO.NET, ASP.NET, Windows Forms и XML уеб услуги.

По качество на изложения материал книгата се отличава с високо профе­сионално ниво и превъзхожда повечето преводни издания по темата. Тя е отлично структурирана, а стилът на изложени­ето е лесен за възприемане. Инфор­мацията е поднесена с много примери, а това е най-важното за един софтуерен разработчик.

Книгата е написана от широк екип доказани специалисти, работещи в партньорските фирми на Майкрософт – хора с опит в разработката на .NET приложения. Основният автор и ръководител на проекта, Светлин Наков, е изтъкнат .NET специалист, лектор в множество семинари и кон­ференции, търсен консул­тант и преподавател. Негови са заслугите за курсовете по програ­миране за платформа .NET във Факултета по матема­тика и информатика на Софийски университет. Негови са и основните заслуги за целия проект по изготвяне на изчерпателно учебно съдържа­ние и книга по програми­ране за .NET Framework.

Светлин Наков е носител на най-голямото отличие в областта на информа­ционните технологии – наградата "Джон Атанасов" на Президента Георги Първанов за принос към развитието на информационните техно­логии информационното общество. Той е автор на десетки статии и книги за програмиране, а настоящото издание е поредната му добра изява.

Настоящата книга е отлично учебно пособие както за начинаещи, така и за напреднали читатели, които имат желание и амбиции да станат профе­сионални .NET разработчици.

 

Теодор Милев,

Управляващ директор на "Майкрософт България"


Отзив от Божидар Сендов

 

Книгата е оригинално българско творение, с нищо неотстъпващо по каче­ство и обем на световните бестселъри с компютърна тематика. Мате­риалът е поднесен достъпно и е богато илюстриран с примери, което я прави не само отлично въведение в платформата .NET за начинаещия, но и отличен справочник за професионалиста-програмист на C#. Читателят може да се запознае в детайли не само с общите принципи, но и с редица тънкости на програмирането за .NET. Широко застъпени са редица "уни­версални" теми като обектно-ориентирано програмиране, регулярни изра­зи, XML, релаци­онни бази данни, програмиране в Интернет, многозадач­ност, сигурност и др.

Книгата се отличава със стегнат и ясен стил на изложението, като е постигнато завидно педагогическо майсторство. Това не бива да ни изне­надва – авторите са водещи специалисти с богат опит не само като профе­сионални софтуерни разработчици, но и като преподаватели във Факул­тета по математика и информатика (ФМИ) на СУ "Св. Климент Охридски". Самата книга в значителна степен се основава на работни лекции, изпол­звани и проверени в поредица от курсове по програмиране за .NET Framework във ФМИ. Сайтът на книгата съдържа над 2000 безплатни слайда, следващи стриктно съдържанието й, а книгата е напълно безплат­на в електронния си вариант, което максимално улеснява използването й в съответен курс по програмиране.

Не на последно място, заслужава да се отбележи систематичният опит за превод на всички термини на български език, съобразен с вече наложи­лата се българска терминология, но и с оригинални идеи при новите понятия.

Работата, която авторите са свършили, е наистина чудесна, а книгата е задължителна част от библиотеката на всеки с интерес към езика C# и изобщо към водещата платформа на Майкрософт .NET.

 

 

 

доц. д-р Божидар Сендов

Факултет по математика и Информатика,

Софийски Университет "Св. Климент Охридски"


Отзив от Стоян Йорданов

 

"Програмиране за .NET Framework" е уникално ръководство за платформа­та .NET. Въпреки, че не е учебник по програмиране, книгата е изключи­телно подходяща както за начинаещия програмист, сблъскващ се за пръв път с .NET, така и за опитния разработчик на .NET приложения, целящ да систематизира и попълни знанията си. Всяка тема в "Програмиране за .NET Framework" започва с основите на разглежданите в нея технологии, но към края на темата читателят е вече запознат с детайлите и тънкос­тите, необходими за успешното им прилагане в практиката.

Обхващайки най-важните аспекти на .NET Framework, книгата започва от основите на езика C# и .NET платформата и постепенно достига до сложни концепции като уеб услуги, сигурност, сериализация, работа с отдалечени обекти, манипулиране на бази данни чрез ADO.NET, потреби­телски интерфейс с Windows Forms, ASP.NET уеб приложения и т.н. Информацията е поднесена изключително достъпно и подкрепена с много­бройни примери и илюстрации. Всяка тема включва и упражнения за самостоятелна работа – неотменим елемент за затвърдяване на придоби­тите от нея знания.

Авторският колектив включва утвърдени специалисти от софтуерните среди. Въпреки, че авторите са над 30, "Програмиране за .NET Framework" не е просто сборник от статии; напротив – всеки от тях е допринесъл с опита и труда си, за да може книгата да бъде това, което е – добре структурирано и изчерпателно ръководство.

Учебник за студента или справочник за специалиста – "Програмиране за .NET Framework" е задължителна за библиотеката на всеки който има досег с .NET.

 

 

 

 

 

Стоян Йорданов,

Software Design Engineer,

Microsoft Corpartion (Redmond)

 

* Мнението е лично на автора му и не обвързва Microsoft Corporation по никакъв начин


Национална академия по разработка на софтуер

Лекторите

» Светлин Наков е автор на десетки технически публи­ка­ции и ня­колко книги, свър­­зани с раз­работката на соф­ту­ер, заради което е тър­сен лектор и кон­султант.

Той е разработчик с дъл­гого­дишен опит, работил по раз­нообразни проекти, реали­зи­рани с раз­лични техноло­гии (.NET, Java, Oracle, PKI и др.) и преподавател по съвре­мен­ни софтуерни технологии в СУ "Св. Климент Охридски".

През 2004 г. е носител на награ­дата "Джон Атанасов" на прези­дента на България Ге­орги Пър­ва­нов.

Светлин Наков ръководи обу­чението по Java технологии в Академията.

 

» Мартин Кулов е софтуерен инженер и консул­тант с дългогодишен опит в изграждането на решения с платформите на Microsoft.

Мартин е опитен инструктор и сертифициран от Майкрософт разработчик по програмите MCSD, MCSD.NET, MCPD и MVP и меж­дународен лектор в световна­та организа­ция на .NET потре­бителски­те групи INETA.

Мартин Кулов ръководи обу­чението по .NET технологии в Академията.

Академията

» Национална академия по раз­ра­ботка на софтуер (НАРС) е център за професионално обу­чение на соф­ту­ерни специалисти.

 

» НАРС провежда БЕЗПЛАТНО кур­сове по разработка на софтуер и съв­ременни софтуерни тех­нологии в Со­фия и други градове.

 

» Предлагани специалности:

§      Въведение в програмирането (с езиците C# и Java)

§      Core .NET Developer

§      Core Java Developer

 

» Качествено обу­чение с много практически про­екти и индивиду­ално внимание за всеки.

 

» Гарантирана работа! Трудов до­говор при постъпване в Академията.

 

» БЕЗПЛАТНО!

Учите безплатно във въведителните курсове и по стипендии от работода­телите в следващите нива.

http://academy.devbg.org


Съдържание

Том 2

Кратко съдържание. 2

Съдържание. 13

Предговор към втория том. 33

За кого е предназначена тази книга? 33

Необходими начални познания. 33

Какво обхваща вторият том на тази книга? 34

Фокусът е върху .NET Framework 1.1. 34

Как е представена информацията? 34

Поглед към съдържанието на втория том. 35

Глава 15. Графичен потребителски интерфейс с Windows Forms. 35

Глава 16. Изграждане на уеб приложения с ASP.NET. 35

Глава 17. Многонишково програмиране и синхронизация. 36

Глава 18. Мрежово и Интернет програмиране. 36

Глава 19. Отражение на типовете (Reflection) 37

Глава 20. Сериализация на данни. 37

Глава 21. Уеб услуги с ASP.NET. 37

Глава 22. Отдалечено извикване на методи (Remoting) 38

Глава 23. Взаимодействие с неуправляван код. 38

Глава 24. Управление на паметта и ресурсите. 38

Глава 25. Асемблита и разпространение (deployment) 39

Глава 26. Сигурност в .NET Framework. 39

Глава 27. Mono - свободна имплементация на .NET. 39

Глава 28. Помощни инструменти за .NET разработчици. 39

Глава 29. Практически проект. 40

Авторският колектив. 40

Александър Русев. 40

Александър Хаджикръстев. 41

Антон Андреев. 41

Бранимир Ангелов. 41

Васил Бакалов. 41

Виктор Живков. 42

Деян Варчев. 42

Димитър Бонев. 42

Димитър Канев. 42

Галин Илиев. 43

Георги Пенчев. 43

Иван Митев. 43

Ивайло Димов. 44

Ивайло Христов. 44

Лазар Кирчев. 44

Манол Донев. 44

Мартин Кулов. 45

Михаил Стойнов. 45

Моника Алексиева. 45

Николай Недялков. 45

Панайот Добриков. 46

Преслав Наков. 46

Радослав Иванов. 47

Рослан Борисов. 47

Светлин Наков. 47

Стефан Добрев. 48

Стефан Кирязов. 48

Стефан Захариев. 48

Стоян Дамов. 49

Тодор Колев. 49

Христо Дешев. 49

Христо Радков. 49

Цветелин Андреев. 50

Явор Ташев. 50

Благодарности. 50

Светлин Наков. 50

Авторският колектив. 51

Българска асоциация на разработчиците на софтуер. 51

Microsoft Research. 51

SciForge.org. 51

Софийски университет "Св. Климент Охридски". 52

telerik. 52

Сайтът на книгата. 52

Лиценз 52

Общи дефиниции. 52

Права и ограничения на потребителите. 53

Права и ограничения на авторите. 53

Права и ограничения на БАРС. 54

Права и ограничения на Microsoft Research. 54

Глава 15. Изграждане на графичен потребителски интерфейс с Windows Forms  55

Автори. 55

Необходими знания. 55

Съдържание. 55

В тази тема ... 56

Какво е Windows Forms? 57

Windows Forms е базирана на RAD концепцията. 57

Windows Forms и другите библиотеки за изграждане на GUI 58

Контролите в Windows Forms. 58

Windows Forms и работа с данни. 59

Вградена поддръжка на Unicode. 59

Наследяване на форми и контроли. 59

ActiveX контроли. 59

Печатане на принтер. 60

Windows Forms контроли в Internet Explorer 60

Силна поддръжка на графика (GDI+) 60

Нашето първо Windows Forms приложение. 60

Библиотеките на .NET за изграждане на GUI 62

Пространството System.Windows.Forms. 62

Пространството System.Drawing. 63

Програмни компоненти. 63

Компонентен модел. 63

Компонентният модел на .NET Framework 63

Компоненти и контейнери. 63

Преизползваемост на компонентите. 63

Пространството System.ComponentModel 64

Windows Forms и компонентният модел на .NET. 64

Контроли и контейнер-контроли. 64

Програмен модел на Windows Forms 64

Форми. 64

Контроли. 65

Събития. 65

Жизнен цикъл на Windows Forms приложенията. 65

Модел на пречертаване на контролите. 67

Управление на фокуса и навигация. 69

Основни класове в Windows Forms 69

Йерархия на класовете. 70

Класът Control 71

Свойства на класа Control 71

Методи на класа Control 73

Събития на класа Control 73

Класът ScrollableControl 74

Класът ContainerControl 75

Форми, прозорци и диалози. 75

Класът System.Windows.Forms.Form.. 75

По-важни свойства на класа Form.. 75

По-важни методи на класа Form.. 77

По-важни събития на класа Form.. 78

Основни контроли в Windows Forms 78

TextBox. 78

Label 79

Button. 79

Поставяне на контроли във формата. 79

Управление на събитията. 79

Прост калкулатор – пример. 80

Windows Forms редакторът на VS.NET. 83

Създаване на форма. 83

Добавяне на контрола. 84

Добавяне на неграфични компоненти. 84

Настройка на свойства. 84

Добавяне на обработчици на събития. 85

Създаване на калкулатор с Windows Forms редактора на VS.NET – пример. 86

Диалогови кутии. 88

Стандартни диалогови кутии. 88

Извикване на диалогови кутии. 89

DialogResult и предаване на данни между диалози – пример. 89

Други Windows Forms контроли. 92

CheckBox. 92

RadioButton. 92

Panel 92

TabControl и TabPage. 93

ListBox. 93

CheckedListBox. 93

ComboBox. 94

TreeView.. 94

RichTextBox. 94

LinkLabel 95

PictureBox. 95

Работа с някои Windows Forms контроли – пример. 95

Менюта. 99

MainMenu. 99

ContextMenu. 99

MenuItem.. 99

Ленти с инструменти. 100

ToolBar 100

ToolBarButton. 100

ImageList 100

Статус ленти. 101

StatusBar 101

StatusBarPanel 101

Диалог за избор на файл. 101

OpenFileDialog. 101

SaveFileDialog. 102

Работа с файлов диалог – пример. 102

MDI приложения. 103

MDI контейнери (MDI parents) 104

MDI форми (MDI children) 104

Създаване на многодокументов текстов редактор – пример. 104

Валидация на данни. 115

Валидация на данни – пример. 116

Свързване на данни. 121

Източници на данни. 122

Контроли, поддържащи свързване на данни. 122

Видове свързване. 122

Просто свързване. 123

Сложно свързване. 131

Контролата DataGrid. 133

Работа с DataGrid контролата – пример. 133

TableStyles и дефиниране на стилове – пример. 135

Master-Details навигация. 137

Master-Details навигация – пример. 138

Проблеми при Master-Details навигацията. 141

Релации "много към много". 141

Наследяване на форми. 142

Наследяване на форми – пример. 142

Пакетът System.Drawing и GDI+. 146

Класът Graphics. 147

Работа със System.Drawing – пример. 147

Анимация със System.Drawing – пример. 148

Печатане на принтер. 150

Потребителски контроли. 151

Създаване на нова контрола, която не наследява съществуваща. 151

Създаване на нова контрола като комбинация от други контроли. 151

Създаване на нова контрола, която наследява съществуваща контрола. 152

Създаване на контрола – пример. 152

Хостинг на контроли в Internet Explorer 157

Хостинг на контроли в Internet Explorer – пример. 157

Нишки и Windows Forms 160

Използване на нишки в Windows Forms приложения – пример. 161

Влачене (Drag and Drop) 165

Влачене и пускане в Windows Forms – пример. 165

Конфигурационен файл на приложението. 167

Извличане на настройки от конфигурационен файл – пример. 167

Упражнения. 169

Използвана литература. 172

Глава 16. Изграждане на уеб приложения с ASP.NET. 173

Автори. 173

Необходими знания. 173

Съдържание. 173

В тази тема ... 174

Въведение. 175

Изпълнение на ASP.NET уеб приложение. 175

Преглед на технологията ASP.NET. 175

Разлики между ASP и ASP.NET. 176

Фундаменти на ASP.NET. 176

Как работи ASP.NET?. 177

Разделяне на визуализация от бизнес логика. 178

Компоненти на ASP.NET. 179

Пример за уеб приложение. 180

ASP.NET Web Application проекти във VS.NET. 181

Модел на изпълнение на ASP.NET. 182

Уеб форми. 183

Какво е уеб форма (Web Form)?. 183

Създаване на уеб форма. 183

Директиви. 184

Директивата <@Page …>. 185

Атрибути на директивата <@Page …>. 185

Тагът <form>. 186

Вградени обекти в ASP.NET. 186

Уеб контроли. 186

ASP.NET сървърни контроли. 187

HTML сървърни контроли (HTML server controls) 188

Уеб сървърни контроли (Web server controls) 190

Кои контроли да ползваме?. 191

Категории уеб сървърни контроли. 192

Code-behind. 195

Добавяне на код в уеб форма. 195

Inline code. 195

Code-behind класове. 196

Как работи code-behind?. 196

JIT компилация. 196

Събития. 197

Прихващане на събития. 197

Свойството AutoEventWireup. 197

Жизнен цикъл на ASP.NET страниците. 198

Свойството IsPostBack. 198

Свойството AutoPostBack. 199

HTML escaping проблеми. 200

HTML escaping проблеми – пример. 200

Свързване с данни (Data binding) 202

Как работи методът DataBind(…)?. 202

Свързване на контроли с данни – пример. 203

Работа с бази от данни от ASP.NET. 209

Обзор на ADO.NET. 209

Визуализиране на данни. 210

Свързване на данни (data binding) 210

Контроли за показване на данни. 212

Списъчни контроли. 213

Итериращи контроли. 219

Управление на състоянието. 228

Бисквитки (Cookies) 228

Скрити полета. 230

Параметризирани адреси (Query Strings) 231

Технологията ViewState. 232

Състояние на приложението. 234

Състояние на сесиите. 237

Валидация на данни. 239

RequiredFieldValidator – проверка за наличие на данни. 240

CompareValidator – проверка на входните данни. 241

RangeValidator – проверка попадане в интервал. 242

RegularExpressionValidator – сравняване с регулярен израз. 243

CustomValidator – произволна проверка. 243

ValidationSummary – списък на грешките. 246

Йерархия на класовете валидатори. 247

Общи свойства за валидаторите. 247

Кога и къде се извършва валидацията?. 248

Защо винаги на сървъра?. 248

Особености при валидацията при клиента. 249

Потребителски контроли. 250

Потребителски контроли и уеб форми. 250

Предимства при използването на потребителски контроли. 250

Споделяне на потребителски контроли. 250

Използване на потребителски контроли. 251

Създаване на потребителска контрола – пример. 251

Проследяване и дебъгване на уеб приложния. 254

Информация по време на изпълнение. 254

Проследяване. 254

Отдалечено дебъгване. 257

Оптимизация, конфигурация и разгръщане на ASP.NET приложения. 258

Оптимизиране чрез кеширане. 258

Конфигуриране на ASP.NET приложение. 262

Разгръщане на приложението. 266

Сигурност в ASP.NET. 268

Автентикация и оторизация. 268

Видове автентикация в ASP.NET. 269

Сигурност на ниво сървър (IIS Security) 276

Упражнения. 279

Използвана литература. 281

Глава 17. Многонишково програмиране и синхронизация. 283

Автори. 283

Необходими знания. 283

Съдържание. 283

В тази тема ... 284

Многозадачност 285

Проблемът. 285

Ползите от многозадачността. 285

Защо е нужна многозадачност – пример. 285

Решението – процеси и нишки. 287

Процеси и нишки. 287

Какво предлагат нишките?. 288

Кога са удобни нишките?. 288

Многозадачност – видове. 288

Имплементации на многозадачност. 289

Домейни на приложението (Application Domains) 290

Нишки. 291

Как работят нишките?. 291

Класът Thread. 293

Приоритет. 298

Състояния. 299

Живот на нишките. 300

Прекратяване на нишка. 300

Thread Local Storage (локални за нишката данни) 305

Thread-Relative Static Fields (статични полета, свързани с нишката) 306

Неудобства при работата с нишки. 308

Проблеми при работа с общи данни. 308

Синхронизация. 310

Най-доброто решение за общите данни. 310

Синхронизирани "пасажи" код (synchronized code regions) 311

Синхронизирани контексти (Synchronized Contexts) 315

MethodImplAttribute. 317

Неуправлявана синхронизация – класът WaitHandle. 317

Класът Mutex. 318

Класовете AutoResetEvent и ManualResetEvent 320

Класът Interlocked. 323

Класически синхронизационни задачи. 325

Пул от нишки (ThreadPool) 329

Предимства. 330

Недостатъци. 330

Класът ThreadPool 330

Методът ThreadPool.RegisterWaitForSingleObject() 331

Интерфейсът ISynchronizeInvoke. 333

Използване на ISynchronizeInvoke. 333

Windows Forms и ISynchronizeInvoke. 335

Таймери. 335

System.Timers.Timer 336

System.Threading.Timer 338

System.Windows.Forms.Timer 340

Как да изберем таймер?. 341

Volatile полета. 341

Асинхронни извиквания. 342

Какво е асинхронно извикване?. 342

Къде се ползва асинхронно извикване?. 342

Асинхронно извикване чрез делегат. 342

Модел за асинхронно програмиране. 343

Сигнатура на методите за асинхронни извиквания. 343

Интерфейсът IAsyncResult 344

Проверка за приключване на асинхронното извикване. 344

Упражнения. 348

Използвана литература. 348

Глава 18. Мрежово и Интернет програмиране. 349

Автори. 349

Необходими знания. 349

Съдържание. 349

В тази тема ... 349

OSI модел. 350

Физическо ниво. 351

Свързващо ниво (канално ниво) 351

Мрежово ниво. 351

Транспортно ниво. 351

Сесийно ниво. 351

Представително ниво. 351

Приложно ниво. 351

Основи на мрежовото програмиране. 352

IP адрес. 352

Domain Name Service (DNS) 352

Порт. 352

Основни мрежови услуги. 353

Мрежов интерфейс. 353

Loopback интерфейс. 353

Протоколът TCP. 354

Протоколът UDP. 354

Как две отдалечени машини си "говорят"?. 354

Класове за мрежово програмиране в .NET. 355

Пространството System.Net.Sockets. 355

Пространството System.Net 356

Представяне на IP адреси в .NET Framework 357

Класът IPAddress. 357

Класът IPEndPoint 359

Комуникация по TCP сокет с TcpClient 359

Създаване и свързване на TcpClient 360

Създаване на прост TCP порт скенер – пример. 362

Предаване на данни по TCP сокет чрез TcpClient и NetworkStream.. 363

Комуникация с TcpClient – пример. 366

Настройки на TCP връзката чрез свойствата на TcpClient 370

Изграждане на TCP сървър с TcpListener 371

Създаване на TcpListener 371

Приемане на TCP връзки. 371

Прост TCP сървър – пример. 373

Обслужване на много клиенти едновременно. 375

Едновременно обслужване на клиенти с TcpListener – пример. 376

Комуникация по UDP с UdpClient 382

Конструктори на UdpClient 383

Задаване на отдалечен сървър по подразбиране. 383

Изпращане на UDP пакети – метод Send(…) 384

Получаване на UDP пакети – метод Receive(…) 385

Комуникация с UdpClient – пример. 385

Сокети на по-ниско ниво – класът Socket 387

Създаване на Socket обекти и тип на сокета. 387

Основни операции с класа Socket 388

Сокети с връзка по TCP. 389

Свойства на сокетите и задаване на опции. 396

Сокет по протокол UDP. 397

Няколко думи за асинхронните сокети. 403

Свойството Blocking. 403

Асинхронни методи. 403

Методите Poll(…) и Select(…) 404

Multicasting в .NET Framework 406

Broadcasting сокети. 406

Multicasting сокети. 406

Използване на DNS услуги чрез класа Dns 408

Асинхронни DNS заявки. 409

Работа с уеб ресурси – класът WebClient 409

Извличане на данни по HTTP. 410

Изпращане на данни по HTTP. 413

Автентикация с Credentials. 414

Други полезни свойства на WebClient 415

HTTP заявки с класовете HttpWebRequest и HttpWebResponse. 416

Създаване на HHTP заявка. 416

Изпращане на данни към HTTP сървър. 416

Получаване на HTTP отговор. 417

Извличане на Cookies. 418

Други видове WebRequest и WebResponse. 419

Работа с HTTP заявки – пример. 419

Работа с електронна поща. 420

Протоколи за изтегляне на електронната поща. 421

Изтегляне на електронната поща с .NET Framework. 421

Изпращане на електронна поща. 421

Изпращане на електрона поща с .NЕТ Framework. 422

Упражнения. 428

Използвана литература. 429

Глава 19. Отражение на типовете (Reflection). 431

Автор. 431

Необходими знания. 431

Съдържание. 431

В тази тема ... 431

Какво е Global Assembly Cache? 432

Инсталиране на асемблита в GAC. 432

Поддръжка на много версии. 433

Преглед на GAC през Windows Explorer 433

Преглед на GAC през Administrative Tools. 435

Отражение на типовете. 437

Какво е Reflection?. 437

Зареждане на асемблита. 437

Извличане информация за асембли. 438

Премахване на асемблита от паметта. 440

Изучаване на типовете в асембли. 440

Reflection класове за видовете членове. 445

Извличане на методи и параметрите им. 446

Reflection Emit 453

Упражнения. 457

Използвана литература. 458

Глава 20. Сериализация на данни. 459

Автор. 459

Необходими знания. 459

Съдържание. 459

В тази тема ... 459

Сериализация. 460

Какво е сериализация (serialization)?. 460

Какво е десериализация (deserialization)?. 460

Кога се използва сериализация?. 460

Защо да използваме сериализация?. 461

Кратък пример за сериализация?. 462

Форматери (Formatters) 462

Процесът на сериализиране. 463

Кратък пример за сериализация. 464

Кратък пример за десериализация. 465

Бинарна сериализация – пример. 466

Сериализация по мрежата – пример. 469

Дълбоко копиране на обекти – пример. 475

IDeserializationCallback. 478

ISerializable и контролиране на сериализацията. 481

За ефективността на сериализацията. 487

XML сериализация. 488

Какво е XML сериализация?. 488

XML сериализация – пример. 488

Проста XML сериализация – пример. 489

Контролиране на изходния XML. 491

Контрол на XML сериализацията – пример. 492

Външен контрол на XML сериализацията. 496

Външен контрол на сериализацията – пример. 497

Приложение: FormatterServices 498

Методи за сериализация. 499

Методи за десериализация. 499

Упражнения. 499

Използвана литература. 500

Глава 21. Уеб услуги с ASP.NET. 501

Автори. 501

Необходими знания. 501

Съдържание. 501

В тази тема ... 502

Възникването на уеб услугите. 503

Разпределени приложения. 503

Модели за разпределени приложения. 503

Нуждата от уеб услуги. 504

Уеб услуги. 506

Какво е услуга?. 506

Какво е уеб услуга?. 506

Принцип на действие на уеб услугите. 507

Инфраструктура на уеб услугите. 508

Директории за уеб услуги. 509

Откриване на уеб услуги. 511

WSDL описания на услуги. 512

SOAP – формат на заявките. 515

Протоколен стек на уеб услугите. 520

Сценарии за използване на уеб услугите. 521

Доставяне на данни. 521

Услуги към клиентски приложения. 522

Интеграция на приложения. 522

В ролята на адаптери. 522

Връзка между отделните компоненти на Enterprise приложения. 523

Enterprise приложения. 523

Кои приложения са Enterprise?. 523

.NET Enterprise приложения. 524

Уеб услугите в ASP.NET. 526

Пространства от имена. 526

Архитектура на ASP.NET уеб услугите. 527

Създаване на уеб услуги. 528

Уеб услугите и уеб приложенията. 529

Публикуване на уеб услуги. 529

Използване на уеб услуги. 536

Уеб услугите и VS.NET – създаване и консумиране. 540

Атрибути за уеб услугите. 542

Прехвърляне на типове (marshalling) 544

Дебъгване на уеб услуги. 553

Моделът на изпълнение на уеб услугите в ASP.NET. 553

Асинхронно извикване на уеб услуги. 555

Уеб услуги и работа с данни. 558

Поддръжка на сесии. 562

Сигурност на уеб услугите. 566

Изключенията в уеб услугите. 572

Упражнения. 584

Използвана литература. 586

Глава 22. Отдалечени извиквания с .NET Remoting. 587

Автор. 587

Необходими знания. 587

Съдържание. 587

В тази тема ... 587

Разпределени приложения. 588

Какво е .NET Remoting? 588

Кога се използва Remoting? 588

Microsoft Indigo (WCF) 589

Remoting инфраструктурата. 589

Как работи Remoting инфраструктурата?. 590

Remoting канали. 590

Форматери (formatters) 592

Активация на обекти. 593

Регистрация на отдалечен обект. 594

Създаване на инстанция на отдалечен обект. 596

Маршализация (Marshaling) 598

Живот на обектите (Lifetime) 600

Remoting конфигурационни файлове. 606

Remoting сценарии. 617

Чиста мрежова комуникация. 619

XML уеб услуги. 619

.NET Remoting. 619

Remoting сървър и клиент – пример. 620

Създаване на общите типове. 620

Създаване на сървър. 622

Създаване на клиент. 624

Сървърът и клиентът в действие. 625

Проблемът с общите типове. 628

Споделено асембли с типове. 628

Споделено асембли с интерфейси. 628

Soapsuds.exe. 629

Хостинг на Remoting типове в IIS. 629

Упражнения. 629

Използвана литература. 630

Глава 23. Взаимодействие с неуправляван код. 631

Автор. 631

Необходими знания. 631

Съдържание. 631

В тази тема ... 631

Какво разбираме под взаимодействие с неуправляван код? 633

Обща среда или виртуална машина. 633

Среда за контролирано изпълнение .NET CLR (обща среда) 634

Виртуална машина JVM.. 634

Платформено извикване (P/Invoke) 636

Атрибут DllImport 636

Как работи P/Invoke?. 640

Командата DUMPBIN. 640

Зареждане на системна икона – пример. 641

Преобразуване на данни (marshalling) 643

Преобразуване на структури. 644

Разполагане на полетата от структурата. 644

Преобразуване на класове. 646

Преобразуване на низове. 646

Атрибут MarshalAs. 648

Имплементиране на функция за обратно извикване (callback) 649

Преобразуване на данни – пример. 650

Взаимодействие с COM (COM interop) 655

Какво е COM?. 655

Видове COM обекти и регистрация. 655

Структура на COM обектите. 656

Извикване на COM обект от управляван код. 657

Разкриване на .NET компонент като COM обект. 662

Взаимодействие със C++ чрез IJW.. 667

IJW извикване от C++ – пример. 667

Препоръки за използване на .NET типове от COM. 668

Immutable ли са наистина символните низове?. 669

Използване на броячи за производителност и CLRSpy – пример. 670

Упражнения. 673

Използвана литература. 673

Глава 24. Управление на паметта и ресурсите. 675

Автори. 675

Необходими знания. 675

Съдържание. 675

В тази тема... 676

Управление на паметта при различните езици и платформи. 677

Ръчно управление на паметта и ресурсите. 677

Предимства и недостатъци на ръчното управление на паметта и ресурсите. 679

Управление на паметта в .NET Framework 681

Предимства и недостатъци на автоматичното управление на паметта. 682

Как се заделя памет в .NET?. 685

Как работи garbage collector?. 687

Поколения памет. 691

Блок памет за големи обекти. 695

Увеличаване размера на хийпа. 696

Финализацията на обекти в .NET. 696

Какво е финализация?. 697

Деструкторите в C#.. 697

Финализация – пример. 699

Зад кулисите. 699

Опашката Freachable. 701

Накратко за финализацията. 701

Тъмната страна на финализацията. 702

Какво да правим все пак?. 703

Съживяване на обекти. 703

Ръчно управление на ресурсите с IDisposable. 705

Интерфейсът IDisposable. 706

Операторът using. 706

IDisposable и Finalize. 707

Примерна имплементация на базов клас, обвиващ неуправляван ресурс. 709

Close() и експлицитна имплементация на IDisposable. 715

Кога да извикваме IDisposable.Dispose()?. 716

Взаимодействие със системата за почистване на паметта. 716

Почистване на паметта. 716

Потискане на финализацията. 720

Изчакване до приключване на финализацията. 720

Регистриране на обекта за финализация. 720

Определяне поколението на обект. 721

Pinning. 721

Удължаване живота на променливите при Interop. 722

Слаби референции. 725

Ефективно използване на паметта. 726

Техниката "пулинг на ресурси" 738

Примерна имплементация на пул от ресурси. 739

Упражнения. 745

Използвана литература. 746

Глава 25. Асемблита и разпространение. 747

Автор. 747

Необходими знания. 747

Съдържание. 747

В тази тема... 748

Асемблитата в .NET Framework 749

Асемблитата съдържат IL код за изпълнение. 749

Асемблитата формират граница за сигурността (security boundary) 749

Асемблитата формират граница за типовете (type boundary) 750

Асемблитата формират граница на видимостта (reference scope boundary) 750

Асемблитата формират граница на версиите (version boundary) 750

Асемблитата са единица за споделяне. 750

Асемблитата са единици за разпространение (deployment units) 751

Метаданни и манифест на асембли. 751

Манифест на асембли. 751

Съдържание на манифеста. 752

Атрибути за работа с манифест. 753

Създаване на многомодулно асембли. 755

Разглеждане на манифеста на асембли с ildasm.. 757

Силно именуване на асембли. 759

Конфигурационни файлове в .NET Framework 761

Как CLR намира асемблитата? 763

Пример 1: Търсене на асембли (probing) 764

Пример 2: Търсене на асембли с тага <codebase>. 764

Създаване на Publisher Policy File. 765

Global Assembly Cache. 766

DLL адът (DLL Hell) 766

Side-by-side execution. 767

Предимства и недостатъци на GAC. 767

Работа с GAC – пример. 768

Разпространение и инсталиране на програмни пакети. 769

Файлове и папки. 770

Асемблита. 772

Инсталационни компоненти. 774

COM базирани обекти. 775

Сървърни компоненти (Serviced Components) 776

Настройки на Internet Information Server (IIS) 777

Промяна на регистрите на Windows. 781

Споделени инсталационни компоненти (Merge Modules) 781

CAB файлове. 782

Локализиране. 782

Debug Symbols. 783

Инсталационни стратегии. 785

No-Touch Deployment (.NET Zero Deployment) 785

Windows Installer 788

Колекция от файлове след компилация. 796

Създаване на MSI инсталационен пакет 798

Създаване на инсталационен пакет на Windows базирано приложение. 799

Създаване на инсталационен пакет на уеб услуга. 809

Допълнителни настройки на инсталационните проекти във VS.NET 2003. 811

Инсталиране/деинсталиране на MSI пакетите. 811

Упражнения. 813

Използвана литература. 814

Глава 26. Сигурност в .NET Framework. 815

Автори. 815

Необходими знания. 815

Съдържание. 815

В тази тема ... 816

Сигурността в .NET Framework 817

Безопасност на типовете. 817

Проблемът "Buffer overrun". 817

Защита на паметта. 818

Прихващане на аритметични грешки. 819

Application Domains. 820

Основни криптографски понятия. 821

Силно-именувани асемблита. 824

Технологията Isolated Storage. 826

Сигурност на кода (Code Access Security) 827

Политиките за сигурност в .NET Framework. 827

Права (Permissions) 829

"Stack Walk" и контрол над правата. 830

Декларативно и програмно искане на права. 831

Сигурност базирана на роли (Role-Based Security) 833

Автентикация и оторизация. 833

Класовете Identity и Principal 833

Работа с WindowsIdentity и WindowsPrincipal 834

Информация за текущия потребител – пример. 834

Работа с GenericIdentity и GenericPrincipal 835

Оторизация по Principal обект. 835

Оторизация с потребители и роли – пример. 837

Криптография в .NET Framework 840

Извличане на хеш стойност. 840

Симетрични криптиращи схеми. 842

Асиметрични криптиращи схеми. 845

Работа с цифрови подписи. 848

XML подписи. 850

Упражнения. 860

Използвана литература. 862

Глава 27. Mono – свободна имплементация на .NET Framework. 863

Автори. 863

Необходими знания. 863

Съдържание. 863

В тази тема... 864

Проектът Mono. 865

Значение на проекта. 865

Статус на проекта. 865

Поддържани операционни системи и архитектури. 865

Инсталиране и конфигуриране на Mono. 866

Инсталиране на Mono върху Linux дистрибуции. 866

Инсталиране на Mono под Windows. 869

Инсталиране на Mono под Mac OS X. 869

Инсталиране на Mono под FreeBSD. 869

Среди за разработка. 870

MonoDevelop. 870

Eclipse. 871

Emacs и Vim.. 872

X-Develop. 872

KDevelop. 872

Какво включва Mono? 872

Виртуална машина. 872

Компилатор за C# – mcs. 874

Mono gmcs. 874

Visual Basic .NET компилатор – mbas. 875

Mono асемблер и дизасемблер – ilasm и monodis. 875

Mono дебъгерът – mdb. 875

Документацията Monodoc. 876

Mono класовете. 877

Полезни инструменти. 878

‘Hello Mono’ с Mono. 878

Сорс кодът. 879

Компилиране. 879

Стартиране. 879

Дизасемблиране. 879

Дебъгване с mdb – Hello Mono ред по ред. 880

ADO.NET и Mono. 881

Npgsql – Data Provider за PostgreSQL. 881

MySQL Data Provider 883

OracleClient – The Oracle Data Provider 884

SqlClient – Data Provider за Microsoft SQL Server 884

Уеб технологиите в Mono. 886

ASP.NET под Mono. 886

Уеб услуги. 890

Графични интерфейси в Mono. 894

Windows Forms. 894

Gtk#.. 895

Glade#.. 896

Gnome#.. 902

QT#.. 902

Cocoa# за Mac OS. 903

Как да пишем преносим код? 903

Програмиране на игри и Tao Framework 904

Tao Framework. 904

SDL.NET. 905

AXIOM.. 905

Java, Python, PHP и Mono. 906

Java за .NET CLR. 906

Python и PHP под Mono. 907

Упражнения. 907

Полезни Mono ресурси. 907

Използвана литература. 907

Глава 28. Помощни инструменти за .NET разработчици. 909

Автори. 909

Необходими знания. 909

Съдържание. 909

В тази тема ... 909

Помощни инструменти за разработка. 910

.NET Reflector 910

Функции. 910

Разширяемост. 912

FxCop. 913

Правила в FxCop. 914

FxCop – графично приложение. 914

FxCopCmd – приложение за командния ред. 916

Ползи от употребата на FxCop. 916

Използвана литература. 917

CodeSmith. 917

Генериране на код. 917

Въведение в шаблоните на CodeSmith. 919

CodeSmith приложения. 922

Използвана литература. 924

NUnit 924

Какво е автоматизиран unit тест?. 924

Писане на тестове с Nunit 925

Изпълнение на тестовете. 928

Характеристики на добрите тестове. 930

Какво да тестваме като програмисти?. 930

Улесняване на тестването. 931

Mock обекти (Mock objects) 933

Работа с NMock. 933

Разширения на NUnit 935

Използвана литература. 938

Log4net 939

За техниката "логинг". 939

Предизвикателствата пред log4net 939

Компоненти на log4net 940

Други характеристики на log4net 944

log4net пример. 945

Използвана литература. 949

NHibernate. 949

Взаимодействие между обекти и релационни СУБД. 949

ADO.NET и силно типизирани DataSets. 950

Обектно-релационен преход. 951

Демонстрационен пример с NHibernate. 952

Помощни инструменти за NHibernate. 958

Други възможности. 958

Използвана литература. 958

NAnt 958

Защо ни е нужен NAnt?. 959

Основни функции. 959

Основни понятия. 960

Изпълнение на NAnt скриптове. 961

Конфигурация на скриптовете. 962

Организация на сложни скриптове. 963

Интеграция с Microsoft Visual Studio.NET. 964

Интеграция с NUnit 965

Използвана литература. 966

Други помощни средства. 966

NDoc. 966

GhostDoc. 966

Snippet Compiler 967

ASP.NET Web Matrix. 967

Tree Surgeon. 967

NDepend. 967

CruiseControl.NET. 967

Портали за инструменти. 968

Упражнения. 968

Глава 29. Практически проект. 971

Автори. 971

Необходими знания. 971

Съдържание. 971

В тази тема ... 972

Система за запознанства в Интернет – визия. 973

Какво е функционална спецификация? 973

Функционални възможности на системата за запознанства. 974

Функционални възможности на ASP.NET уеб приложението. 974

Функционални възможности на Windows Forms клиентското приложение. 977

Нефункционални изисквания към системата за запознанства по Интернет. 977

Архитектура на системата. 978

Имплементация на системата. 979

Слой за данни. 979

Бизнес слой – ASP.NET уеб услугата. 984

Имплементация на ASP.NET уеб услугата. 986

Клиентски слой – Windows Forms GUI приложение. 993

Имплементация на Windows Forms клиента. 994

Клиентски слой – ASP.NET уеб приложението. 1004

Имплементация на ASP.NET уеб приложението. 1007

Инсталиране и внедряване на системата. 1024

Системни изисквания. 1025

От къде да изтеглим системата и сорс кода й?. 1025

Възстановяване на базата данни в SQL Server 1025

Инсталиране и внедряване на ASP.NET уеб услугата. 1027

Инсталиране на Windows Forms клиента. 1029

Инсталиране на ASP.NET уеб приложението. 1029

Използвана литература. 1029

Заключение към втория том. 1031


Национална академия по разработка на софтуер

Лекторите

» Светлин Наков е автор на десетки технически публи­ка­ции и ня­колко книги, свър­­зани с раз­работката на соф­ту­ер, заради което е тър­сен лектор и кон­султант.

Той е разработчик с дъл­гого­дишен опит, работил по раз­нообразни проекти, реали­зи­рани с раз­лични техноло­гии (.NET, Java, Oracle, PKI и др.) и преподавател по съвре­мен­ни софтуерни технологии в СУ "Св. Климент Охридски".

През 2004 г. е носител на награ­дата "Джон Атанасов" на прези­дента на България Ге­орги Пър­ва­нов.

Светлин Наков ръководи обу­чението по Java технологии в Академията.

 

» Мартин Кулов е софтуерен инженер и консул­тант с дългогодишен опит в изграждането на решения с платформите на Microsoft.

Мартин е опитен инструктор и сертифициран от Майкрософт разработчик по програмите MCSD, MCSD.NET, MCPD и MVP и меж­дународен лектор в световна­та организа­ция на .NET потре­бителски­те групи INETA.

Мартин Кулов ръководи обу­чението по .NET технологии в Академията.

Академията

» Национална академия по раз­ра­ботка на софтуер (НАРС) е център за професионално обу­чение на соф­ту­ерни специалисти.

 

» НАРС провежда БЕЗПЛАТНО кур­сове по разработка на софтуер и съв­ременни софтуерни тех­нологии в Со­фия и други градове.

 

» Предлагани специалности:

§      Въведение в програмирането (с езиците C# и Java)

§      Core .NET Developer

§      Core Java Developer

 

» Качествено обу­чение с много практически про­екти и индивиду­ално внимание за всеки.

 

» Гарантирана работа! Трудов до­говор при постъпване в Академията.

 

» БЕЗПЛАТНО!

Учите безплатно във въведителните курсове и по стипендии от работода­телите в следващите нива.

http://academy.devbg.org


 

 

 

 

 

www.devbg.org

 

 

Българска асоциация на разработчиците на софтуер (БАРС) е нестопанска организация, която подпомага про­фе­сионалното развитие на българските софтуерни специ­а­листи чрез образо­вателни и други инициативи.

БАРС работи за насърчаване обмяната на опит между раз­работ­чиците и за усъвършенстване на техните знания и умения в областта на проектирането и разработката на софтуер.

Асоциацията организира специализирани конференции, семи­нари и курсове за обучение по разработка на софту­ер и софту­ерни технологии.

БАРС организира създаването на Национална академия по раз­работка на софтуер – учебен център за професионал­на подго­товка на софтуерни специалисти.

 


Предговор към втория том

Ако по принцип не четете уводите на книгите, пропуснете и този. В него ще научите най-вече какво ви предстои в следващите глави и как се стигна до написването на настоящата книга.

Това е втори том на първата чисто българска книга за програмиране с .NET Framework и C#, но въпреки, че фокусира върху .NET Framework 1.1, тя е едно от най-полезните четива в тази област. Написана от специа­листи с опит както в практическата работа с .NET, така и в обучението по програ­миране, книгата ще ви даде не само основите на .NET програми­рането, но и ще ви запознае с някои по-сложни концеп­ции и ще ви предаде от опита на авторите.

За кого е предназначена тази книга?

Вторият том на книгата е предназначен за всички, които са прочели първия том и той им допада. Тя е за всички, които искат да продължат обогатяването на знанията и уменията си за разработка на софтуер за .NET платформата.

Вторият том е просто продължение на първия и включва няколко много важни техно­логии от .NET Framework, а именно Windows Forms, ASP.NET уеб приложения и уеб услуги.

Тази книга ще ви даде много повече от начални знания. Тя ще ви предаде опит, натрупан в продъл­жение години, и ще ви запознае с утвър­дените практики при използването на .NET технологиите.

Книгата е полезна не само за .NET програмисти, но и за всички, които имат желание да се занимават сериозно с разработка на софтуер. В нея се обръща внимание не само на специфичните .NET технологии, но и на някои фундамен­тални концепции, които всеки програмист трябва добре да знае и разбира.

Необходими начални познания

Тази книга не е подходяща за хора, които никога не са програмирали в живота си. Ако сте абсолютно начинаещ, спрете да четете и просто започ­нете с друга книга!

Том 2 на книгата не е подходящ за хора, които не са чели (или поне прегледали набързо) първия том. Вторият том е естествено продължение на първия том и е силно свързан с материала, изложен в него. И двете части на книгата са свободно достъпни от Интернет (от адрес http://www. devbg.org/dotnetbook/), така че нямате оправдание да започвате направо от втората. Не ви го препоръчваме!

Какво обхваща вторият том на тази книга?

Програмирането за .NET Framework изисква познания на неговите базови концепции (модел на изпълнение на кода, обща система от типове, управ­ление на паметта, масиви, колекции, символни низове и др.), както и познаване на често използваните технологии – ADO.NET (за достъп до бази от данни), Windows Forms (за приложения с графичен потребителски интерфейс), ASP.NET (за уеб приложения и уеб услуги) и др.

Първият том на книгата обхваща основните концепции в .NET програми­рането (от езика C# до ADO.NET), а вторият – по-сложните технологии като Windows Forms, ASP.NET, уеб услуги, нишки, мрежово програмиране, сигурност и др.

Във втория том се обръща внимание на създа­ването на графичен пот­ребителски интерфейс с Windows Forms и уеб-бази­рани при­ложения с ASP.NET. Ще бъдат разгледани и някои по-сложни концепции като отра­жение на типовете, сериализация, много­нишково програмиране, уеб услуги, отдалечено извикване на методи (remoting), взаимодей­ствие с неуправляван код, асемблита, управление на сигурността, по-важни инструменти за разработка и др. Ще бъде разгледана и свободната имплементация на .NET Framework за Linux и други операци­онни системи Mono. Накрая ще бъде описана разра­ботката на един цялостен практи­чески проект, който обхваща всички по-важни технологии и демонстрира добрите прак­тики при изграждането на .NET приложения.

Фокусът е върху .NET Framework 1.1

Всички теми са базирани на .NET Framework 1.1, Visual Studio .NET 2003 и MS SQL Server 2000. За съжаление по време на изготвянето на текста на книгата (през 2004-2005 г.) версия 2.0 на .NET платформата едва прохож­даше и това наложи да не бъдат включени новостите от него.

Надяваме се в следващото издание на книгата авторският колектив да намери време и сили да обнови съдържанието с новостите от .NET 2.0 и да отправи поглед към .NET 3.0.

Как е представена информацията?

Въпреки големия брой автори, съавтори и редактори, стилът на текста в книгата е изключително достъпен. Съдържанието е представено в добре структуриран вид, разделено с множество заглавия и подзаглавия, което позволява лесното му възприемане, както и бързото търсене на инфор­мация в текста.

Настоящата книга е написана от програмисти за програмисти. Авто­рите са действащи софтуерни разработчици, хора с реален опит както в разра­ботването на софтуер, така и в обучението по програмиране. Благо­даре­ние на това качеството на изложението е на мно­го високо ниво.

Всички автори ясно съзнават, че примерният сорс код е едно от най-важните неща в една книга за програ­ми­ране. Именно поради тази причи­на текстът е съпроводен с много, много примери, илюстрации и картинки.

Въобще някой чете ли текста, когато има добър и ясен пример? Повечето програмисти първо гледат дали примерът ще им свърши работа, и само ако нещо не е ясно, се зачитат в текста (това всъщност не е никак добра практика, но такава е реалността). Ето защо многото и добре подбрани примери са един от най-важните принципи, залегнали в тази книга.

Поглед към съдържанието на втория том

Книгата се състои от 29 глави, които поради големия обем са разделени в два тома. Том 1 съдържа първите 14 глави, а том 2 – остана­лите 15. Това важи само за хартиеното издание на книгата. В електронния вариант тя се разпространява като едно цяло.

Нека направим кратък преглед на всяка една от главите и да се запознаем с нейното съдържание, за да разберем какво ни очаква по-нататък. Гла­вите от втория том можете да намерите в настоящото издание, а остана­лите – в първи том.

Глава 15. Графичен потребителски интерфейс с Windows Forms

В глава 15 се разглеждат средствата на Windows Forms за създаване на прозоречно-базиран графичен потребителски интерфейс (GUI) за .NET приложенията. Представят се програмният модел на Windows Forms, него­вите базови контроли, средствата за създаване на прозорци, диалози, менюта, ленти с инструменти и статус ленти, както и някои по-сложни концепции като: MDI приложения, data-binding, наследяване на форми, хостинг на контроли в Internet Explorer, работа с нишки във Windows Forms и др.

Автори на главата са Радослав Иванов (по-голямата част) и Светлин Наков. Текстът е базиран на лекцията на Светлин Наков по същата тема. Редактори са Светлин Наков и Пламен Табаков.

Глава 16. Изграждане на уеб приложения с ASP.NET

В глава 16 се разглежда разработката на уеб приложения с ASP.NET. Представят се програмният модел на ASP.NET, уеб формите, кодът зад тях, жизненият цикъл на уеб приложенията, различните типове контроли и техните събития. Показва се как се дебъгват и проследяват уеб прило­жения. Отделя се внимание на валидацията на данни, въведени от потре­бителя. Разглежда се концепцията за управление на състоянието на обек­тите – View State и Session State. Демонстрира се как могат да се визуа­лизират и редактират данни, съхранявани в база от данни. Диску­тират се разгръщането и конфигурирането на ASP.NET уеб приложе­нията в Internet Information Server (IIS) и сигур­ността при уеб приложенията.

Автори на главата са Михаил Стойнов, Рослан Борисов, Стефан Добрев, Деян Варчев, Иван Митев и Христо Дешев. Текстът е базиран на лекцията на Михаил Стойнов по същата тема. Редактори са Иван Митев и Пламен Табаков.

Тази глава беше най-обемната, най-трудната и най-бавно написаната. Поради някои проблемни ситуации в авторския колектив се наложи на няколко пъти да се сменят авторите и това реално забави целия втори том. За радост всичко приключи успешно.

Глава 17. Многонишково програмиране и синхронизация

В глава 17 се разглежда многозадачността в съвременните опе­рационни системи и средствата за паралелно изпълнение на програ­мен код, които .NET Framework предоставя. Обръща се внимание на ниш­ките (threads), техните състояния и управлението на техния жизнен цикъл – стартиране, приспиване, събуждане, прекратяване и др.

Разглеждат средствата за синхронизация на нишки при достъп до общи данни, както и начините за изчакване на зает ресурс и нотификация при освобождаване на ресурс. Обръща се внимание както на синхронизацион­ните обекти в .NET Framework, така и на неуправляваните синхронизаци­онни обекти от операционната система.

Изяснява се концепцията за работа с вградения в .NET Framework пул от нишки (thread pool), начините за асинхронно изпълнение на задачи, сред­ствата за контрол над тяхното поведение и препоръчваните практики за работа с тях.

Автор на главата е Александър Русев. Текстът е базиран в голямата си част на лекцията на Михаил Стойнов и авторските бележки в нея. редак­тори са Иван Митев, Георги Митев, Георги Митев, Яни Георгиев и Минчо Колев.

Глава 18. Мрежово и Интернет програмиране

В глава 18 се разглеждат някои основни средства, предлагани от .NET Framework за мрежово програмиране. Главата започва със съвсем кратко въведение в прин­ципите на работа на съвременните компютърни мрежи и на Интернет и продължава с протоколите, чрез които се осъществява мре­жовата комуни­кация. Обект на дискусия са както класовете за работа с TCP и UDP сокети, така и някои класове, предлагащи по-специфични въз­можности, като представяне на IP адреси, изпълняване на DNS заявки и др. В края на главата ще се представят средствата за извли­чане на уеб-ресурси от Интернет и на класовете за работа с e-mail в .NET Framework.

Автори на главата са Ивайло Христов и Георги Пенчев. Текстът широко използва лекцията на Ивайло Христов по същата тема. Редактори са Венцислав Попов, Стефан Чанков, Лъчезар Георгиев и Теодор Стоев.

Глава 19. Отражение на типовете (Reflection)

В глава 19 се представя понятието Global Assembly Cache (GAC) и отра­жение на типовете (reflection). Разглеждат се начините за зареждане на асембли. Демонстрира се как може да се извлече информация за типове­те в дадено асембли и за членовете на даден тип. Разглеждат се начини за динамич­но извикване на членове от даден тип. Обяснява се как може да се създаде едно асембли, да се дефинират типове в него и асемблито да се запише във файл по време на изпълнение на програмата.

Автор на главата е Димитър Канев. Текстът е базиран на лекцията на Ивайло Христов по същата тема. Редактор е Светлин Наков.

Глава 20. Сериализация на данни

В глава 20 се разглежда сериализацията на данни в .NET Framework. Обяснява се какво е сериализация, за какво се използва и как се контро­ли­ра процесът на сериализация. Разглеждат се видовете форматери (formatters). Обяснява се какво е XML сериализация, как работи тя и как може да се контролира изходният XML при нейното използване.

Автор на главата е Радослав Иванов. Текстът е базиран на лекцията на Михаил Стойнов по същата тема. Редактор е Светлин Наков.

Глава 21. Уеб услуги с ASP.NET

В глава 21 се разглеждат уеб услугите, тяхното изграждане и консумация чрез ASP.NET и .NET Framework. Обект на дискусия са основните техноло­гии, свързани с уеб услу­гите, и причината те да се превърнат в стандарт за интеграция и между­плат­формена комуникация. Представят се различни сценарии за изпол­зването им. Разглежда се програмният модел за уеб услуги в ASP.NET и сред­ствата за тяхното изграждане, изпълнение и раз­гръщане (deployment). Накрая се дискутират някои често срещани проблеми и утвърдени практики при разработката на уеб услуги чрез .NET Framework.

Автори на главата са Стефан Добрев и Деян Варчев. В текста са изпол­звани материали от лекцията на Светлин Наков по същата тема. Техни­чески редактор е Мартин Кулов.

Глава 22. Отдалечено извикване на методи (Remoting)

В глава 22 се разглежда инфраструктурата за отдалечени извик­вания, която .NET Framework предоставя на разработчиците. Обясняват се осно­вите на Remoting технологията и всеки един от нейните компо­ненти: канали, форматери, отдалече­ни обекти и активация. Дискутират се разли­ките между различните типове отдалечени обекти. Обясняват се техният жизнен цикъл и видовете маршали­зация. Стъпка по стъпка се достига до създаването на приме­рен Remoting сървър и клиент. Накрая се представя един гъвкав и практичен начин за конфигуриране на цялата Remoting инфраструктура чрез конфигурационни файлове.

Автор на главата е Виктор Живков. В текста са използвани материали от лекцията на Светлин Наков. Редактори са Иван Митев и Светлин Наков.

Глава 23. Взаимодействие с неуправляван код

Глава 23 разглежда как можем да разширим възможностите на .NET Framework чрез употреба на предоставените от Windows приложни прог­рамни интер­фейси (API). Дискутират се средствата за извикване на функ­ци­оналност от динамични Win32 библиотеки и на проблемите с прео­бразу­ва­нето (маршализацията) между Win32 и .NET типовете.

Обръща се внимание на връзката между .NET Framework и COM (компо­нентният модел на Windows). Разглеждат се както извикването на COM обекти от .NET код, така и разкриването на .NET компонент като COM обект. Демонстрира се и технологията IJW за използване на неуправляван код от програми, написани на Managed C++.

Автор на главата е Мартин Кулов. Текстът е базиран на неговата лекция по същата тема. Технически редактор е Галин Илиев.

Глава 24. Управление на паметта и ресурсите

В глава 24 се разглежда писането на правилен и ефективен код по отно­шение използването на паметта и ресурсите в .NET Framework. В началото се прави сравнение на предимствата и недостатъците на ръчното и авто­матичното управление на памет и ресурси. След това се разглежда по-обстойно авто­матич­ното им управление с фокус най-вече върху системата за почистване на паметта в .NET (т. нар. garbage collector). Обръща се внимание на взаимо­действието с нея и практиките, с които можем да й помогнем да работи възможно най-ефективно.

Автори на главата са Стоян Дамов и Димитър Бонев. Технически редактор е Светлин Наков.

Глава 25. Асемблита и разпространение (deployment)

В глава 25 се разглежда най-малката съставна част на .NET приложе­нията – асембли, различните техники за разпространение на готовия соф­туерен продукт на клиентските работни станции и някои избрани техники за създаване на инсталационни пакети и капаните, за които трябва да се внимава при създаване на инсталационни пакети.

Автор на тази глава е Галин Илиев. В текста е използвана частично лекцията на Михаил Стойнов. Редактор е Явор Янев.

Глава 26. Сигурност в .NET Framework

В глава 26 се разглежда как .NET Framework подпомага сигурността на създаваните приложения. Това включва както безопасност на типовете и защита на паметта, така и средствата за защита от изпъл­нение на неже­лан код, автентикация и оторизация, електронен подпис и криптогра­фия. Разглеждат се технологиите на .NET Framework като Code Access Security, Role-Based Security, силно-именувани асемблита, цифрово подписване на XML документи (XMLDSIG) и други.

Автори на главата са Тодор Колев и Васил Бакалов. В текста е широко използвана лекцията на Светлин Наков по същата тема. Технически редактор е Станислав Златинов.

Глава 27. Mono - свободна имплементация на .NET

В глава 27 се разглежда една от алтернативите на Microsoft .NET Framework – проектът с отворен код Mono. Обясняват се накратко начи­ните за инсталиране и работа с Mono, използването на вградените техно­логии ASP.NET и ADO.NET, както и създаването на графични приложения. Дават се и няколко съвети и препоръки за писането на преносим код.

Автори на главата са Цветелин Андреев и Антон Андреев. Текстът е бази­ран на лекцията на Антон Андреев по същата тема. Технически редактор е Светлин Наков. Като редактори участват още Соня Бибиликова, Мартин Кирицов, Николай Митев и Александър Николов.

Глава 28. Помощни инструменти за .NET разработчици

В глава 28 се разглеждат редица инструменти, използвани при разработ­ката на .NET приложения. С тяхна помощ може значително да се улесни изпълнението на някои често срещани програмистки задачи. Изброените инструменти помагат за повишаване качеството на кода, за увеличаване продуктивността на разработка и за избягване на някои традиционни трудности при поддръжката. Разглеждат се в детайли инструментите .NET Reflector, FxCop, CodeSmith, NUnit (заедно с допълненията към него NMock, NUnitAsp и NUnitForms), log4net, NHibernate и NAnt.

Автори на главата са Иван Митев и Христо Дешев. Текстът е по техни авторски материали. Редактори са Теодора Пулева и Борислав Нановски.

Глава 29. Практически проект

В глава 29 се дискутира как могат да се приложат на практика техно­логиите, разгледани в предходните теми. Поставена е задача да се раз­работи един сериозен практически проект – система за запознанства в Интернет с възможност за уеб и GUI достъп.

При реализа­цията на системата се преминава през всичките фази от раз­работката на софтуерни проекти: анализиране и дефиниране на изисква­нията, изготвяне на системна архитектура, проектиране на база от данни, имплементация, тестване и внедряване на системата.

При изготвяне на архитектурата приложението се разделя на три слоя – база от данни (която се реализира с MS SQL Server 2000), бизнес слой (който се реализира като ASP.NET уеб услуга) и клиентски слой (който се реализира от две приложения – ASP.NET уеб клиент и Windows Forms GUI клиент).

Ръководител на проекта е Ивайло Христов. Автори на проекта са: Ивайло Христов (отговорен за Windows Forms клиента), Тодор Колев и Ивайло Димов (отговорни за уеб услугата и базата данни) и Бранимир Ангелов (отговорен за ASP.NET уеб клиента). Инсталаторът на проекта е създаден от Галин Илиев. Технически редактори на кода са Мартин Кулов, Светлин Наков, Стефан Добрев и Деян Варчев.

Автори на текста са Ивайло Христов, Тодор Колев, Ивайло Димов и Бранимир Ангелов. Технически редактор е Иван Митев. Редактор на текста е Вера Моллова.

Авторският колектив

Авторският колектив се състои от над 30 души – автори, съавтори, редак­тори и други. Ще представим всеки от тях с по няколко изречения (под­редбата е по азбучен ред).

Александър Русев

Александър Русев е програмист във фирма Johnson Controls (www.jci.com), където се занимава с разработка на софтуер за леки автомобили. Завър­шил е Тех­нически университет – София, специалност компютърни системи и техно­логии. Александър се е занимавал и с разработка на софтуер за мобилни теле­фони. Професионалните му интереси включват Java техноло­гиите и .NET платформата. Можете да се свържете с Александър по e-mail: arussev@gmail.com.

Александър Хаджикръстев

Александър Хаджикръстев е софтуерен архитект със сериозен опит в областта на проектирането и разработката на уеб базирани системи и e-commerce приложения. Той е сътрудник и консултант на PC Magazine България (www.sagabg.net/PCMagazine/) и почетен член на Бъл­гарската асоциация на софтуерните разработчици (www.devbg.org). Александър има дългогодишен опит като ръководител на софтуерни проекти във фирми, базирани в България и САЩ. Професионалните му интереси са свързани с проектирането и изграждането на .NET прило­жения, разработ­ването на експертни системи и софтуер за управление и автоматизация на бизнес процеси.

Антон Андреев

Антон Андреев работи като ASP.NET уеб разработчик във фирма Elements of Art (www.eoa.bg). Той се интересува се от всичко, свързано с компют­рите и най-вече с .NET и Linux. Като ученик се е занимавал с алгоритми и е участвал в олимпиади по информа­тика. Завършил е математическа гим­назия и езикова гимназия с английски език, а в момента е студент в специалност информатика във Факул­тета по матема­тика и информатика (ФМИ) на Софийски университет "Св. Климент Охридски". Работил е и като системен админи­стратор във ФМИ и сега продължава да подпомага проектите на факул­тета, разработвайки нови сайтове. Неговият личен сайт е достъпен от адрес: http://debian.fmi.uni-sofia.bg/~toncho/portfolio/. Можете да се свър­жете с Антон по e-mail: anton.andreev@fmi.uni-sofia.bg.

Бранимир Ангелов

Бранимир Ангелов е софтуерен разработчик във фирма Gugga (www.gugga.net) и студент във Факултета по Математика и информатика на Софийски университет "Св. Климент Охридски", специалност компю­търни науки. Неговите професионални интереси са в областта на обектно-ориен­тирания анализ, моделиране и програмиране, уеб технологиите и в част­ност изграждането на RIA (Rich Internet Applications) и разработката на софтуер за мобилни устройства. Бранимир е печелил грамоти и отли­чия от различни състе­зания, както и първо място на Националната олим­пиада по информаци­онни технологии, на която е бил и жури година по-късно.

Васил Бакалов

Васил Бакалов е студент, последен курс, в Американския университет в България, специалност Информатика. Той е председател на студентския клуб по информационни технологии и е студент-консултант на Microsoft България за университета. В рамките на клуба се занимава с управление на проекти и консултации по изпълнението им. Като студент-консултант на Microsoft България Васил подпомага усилията на Microsoft да поддържа тясна връзка със студентите и да ги информира и обучава по най-новите й продукти и технологии. Васил работи и като сътрудник на PC Magazine България от няколко години и има редица статии и коментари в изда­нието. В университета той предлага и изготвя план за курс по практи­ческо изучаване на роботика, като разширение на обучението по изкуст­вен интелект, който е одобрен и внедрен. Той работи и с няколко ИТ фирми, където изгражда решения, базирани на .NET плат­формата. Прите­жава професио­нална сер­тифика­ция от Microsoft. Можете да се свържете с Васил по e-mail: dotnetbook@vassil.info.

Виктор Живков

Виктор Живков е софтуерен инженер в Интерконсулт България (www.icb.bg). В момента е студент в Софийски Университет "Св. Климент Охридски", специалност информатика. Професионалните му интереси са основно в областта на решенията, базирани на софтуер от Microsoft. Виктор има сериозен опит в работата с .NET Framework, Visual Studio .NET и Microsoft SQL Server. Той участва в проекти за различни информационни системи, главно за Норвегия. Членува в БАРС от 2005 година. За връзка с Виктор можете да използвате неговия e-mail: viktor.zhivkov@gmail.com.

Деян Варчев

Деян Варчев е старши уеб разработчик във фирма Vizibility (www.vizibility.net). Неговите отговорности включват проектиране­то и разработката на уеб базирани приложения, използващи последните тех­нологии на Microsoft, проучване на новопоявяващи се технологии и пла­ниране на тяхното внедряване в производството, както и обучение на нови колеги. Неговите професионални интереси са свързани тясно с технологиите на Microsoft – .NET платформата, SQL Server, IIS, BizTalk и др. Деян е студент по информатика във Факултета по математика и информатика на Софийски университет "Св. Климент Охридски".

Димитър Бонев

Димитър Бонев е софтуерен разработчик във фирма Formula Telecom Solutions (www.fts-soft.com). Той отговаря за разработването на уеб бази­рани приложения за корпоративни клиенти, както и за някои модули и инструменти, свързани с вътрешния процес на разработка във фирмата. Професионалните му интереси са насочени предимно към .NET платфор­мата, методологията extreme programming и софтуерния дизайн. Димитър е завършил ВВВУ "Г. Бенковски", специалност компютърна техника. Той има богат опит в разработването на софтуерни решения, предимно с тех­нологиите на Microsoft и Borland.

Димитър Канев

Димитър Канев е разработчик на софтуер във фирма Медсофт (www.medsoft.biz). Той е завършил Факултета по математика и информа­тика на Софийски университет "Св. Кли­мент Охридски", специалност информатика. Професио­налните му интере­си са основно в областта на решенията, базирани на софтуер от Microsoft. Димитър има сериозен опит в работата с Visual Studio .NET, Microsoft SQL Server и ГИС системи. Рабо­тил е в проекти за изграждане на големи информационни системи, свър­зани с ГИС решения, и експертни системи за медицински лаборатории.

Галин Илиев

Галин Илиев е ръководител на проекти и софтуерен архитект в бъл­гарския офис на Technology Services Consulting Group (www.wordassist.  com). Галин е участвал в проектирането и разработ­ването на големи информационни системи, Интернет сайтове с управление на съдържа­нието, допълнения и интеграция на MS Office със системи за управление на документи. Той притежава степен бакалавър по менидж­мънт и инфор­ма­ционни технологии, а също и сертификация MCSD за Visual Studio 6.0 и Visual Studio .NET. Той има сериозен опит с работата с Visual Studio .NET, MS SQL Server, MS IIS и MS Exchange. Личният му сайт е достъпен от адрес www.galcho.com, а e-mail адресът му е Iliev@galcho.com.

Георги Пенчев

Георги Пенчев е софтуерен разработчик във фирма Symex България (www.symex.bg), където отговаря за разработка на финансово ориенти­рани графични Java приложения и на Интернет финансови портали с Java и PHP. Участвал е в изграждането на продукти за следене и обработка на борсови индекси и котировки за Българската фондова борса. Георги е студент по информатика във Факултета по математика и инфор­матика на Софийски университет "Св. Климент Охридски". Професионалните и ака­де­мичните му инте­реси са насочени към Java и .NET технологиите, биоин­форматикатa, тео­ретичната информатика, изкуствения интелект и базите от знания. През 2004 и 2005 г. е асистент в курса по "Информационни технологии" за студенти с нарушено зрение и в практическия курс по "Структури от данни и програ­миране" в Софийски университет. Можете да се свържете с Георги по e-mail: pench_wot@yahoo.com.

Иван Митев

Иван Митев е софтуерен разработчик във фирма EON Technologies (www.eontechnologies.bg). Той е завършил Факултета по математика и информатика на Софийски университет "Св. Климент Охридски", специал­ност информатика. Иван е участвал в проектирането и реализацията на множество информа­ционни системи, основно ГИС решения. Професионал­ният му опит е в разработки предимно с продукти и технологии на Microsoft. Основните интереси на Иван са в създаването на качествени и ефективни софтуерни решения чрез използването на подходящи прак­тики, технологии и инстру­менти. Технически уеблог, който той поддържа от началото на 2004 година, е с акцент върху .NET програмирането и е достъпен на адрес http://immitev.blogspot.com. Можете да се свържете с Иван по e-mail: immitev@gmail.com.

Ивайло Димов

Ивайло Димов е софтуерен разработчик във фирма Gugga (www.gugga.com). Неговите интереси са в областта на обектно-ориенти­раното моделиране, програмиране и анализ, базите от данни, уеб прило­женията и приложения, базирани на Microsoft .NET Framework. В момента Ивайло е студент във Факултета по математика и информатика на Софий­ски университет "Св. Климент Охридски", специалност Компютърни науки. Той е сертифициран от Microsoft разработчик и е печелил редица грамоти и отличия от състе­зания по програмиране. През 2004 г. е победител в Националната олим­пиада по информационни технологии и е участвал в журито на същата олимпиада година по-късно.

Ивайло Христов

Ивайло Христов е преподавател в Софийски университет "Св. Климент Охридски", където води курсове по "Програмиране за .NET Framework", "Качествен програмен код", "Увод в програмирането", "Обектно-ориенти­рано програмиране" и "Структури от данни в програмирането". Неговите професионални инте­реси са в областта на .NЕТ технологиите и Интернет технологиите. Като ученик Ивайло е участник в редица национални състе­зания и конкурси по програмиране и е носител на престижни награди и отличия. Той участва в екип, реализирал образователен проект на Microsoft Research в областта на .NET Framework. Личният сайт на Ивайло е достъпен от адрес: www.ivaylo-hristov.net.

Лазар Кирчев

Лазар Кирчев е завършил Факултета по математика и информатика на Софийски университет "Св. Климент Охридски" и в момента е дипломант в специализация "Информационни системи". Той работи в Института за паралелна обра­ботка на информацията към БАН по съвместен проект между Факултета по математика и информатика и БАН за изграждане на grid система. Неговите интереси включват .NET платформата, grid систе­мите и базите от данни.

Манол Донев

Манол Донев е софтуерен разработчик във фирма telerik (www.telerik.  com). Той е част от екипа, който разработва уеб-базираната система за управление на съдържание Sitefinity (www.sitefinity.com). Манол е студент във Факултета по математика и информатика на Софийски университет "Св. Климент Охридски", специалност Информатика. Неговите професио­нални интереси обхващат най-вече .NET технологиите (в частност ASP.NET уеб приложе­ния, XML и уеб услуги). Можете да се свържете с Манол по e-mail: manol.donev@gmail.com.

Мартин Кулов

Мартин Кулов е сертифициран инструктор и разработчик по програмите Microsoft Certified Trainer (MCT) и MCSD.NET. През 2006 г. е награден от Майкрософт с наградата Most Valuable Professional (MVP). Той е директор направление .NET към Национална академия по разработка на софтуер, където е отговорен за разработка на курсове, обучение и проучване на най-новите технологии на Майкрософт като Visual Studio Team System, Indigo, WSE, ASP.NET, Analysis Services 2005, VSTO, Atlas и др. Мартин е почетен член на Българската асоциация на разра­ботчиците на софтуер (БАРС), член на SofiaDev .NET потребителската група, лектор при меж­ду­народната .NET асоциация - INETA и лектор на редица семинари на Майкрософт. Той е регионален президент на Междуна­родната асоциация на софтуерните архитекти (IASA) за България. Неговият личен дневник (блог) може да намерите на адрес http://www.codeattest.com/blogs/martin.

Михаил Стойнов

Михаил Стойнов е софтуерен разработчик във фирма MPS (www.mps.bg), която е подизпълнител на Siemens A.G. Той се занимава професи­онално с програмиране за платформите Java и .NET Framework от няколко години. Участва като лектор в преподава­телския екип на курсовете "Програмира­не за .NEТ Framework" и "Качес­твен програмен код". Той е студент-кон­султант на Майкро­софт България за Софийски университет през послед­ните 2 години и подпомага раз­пространението на най-новите продукти и технологии на Microsoft в университета. Михаил е бил лектор на меж­дународни конференции за ГИС сис­теми. Интересите му обхващат разра­ботка на уеб приложения, прило­же­ния с бази от данни, изграждане на сървърни системи и участие в ака­де­мични дейности.

Моника Алексиева

Моника Алексиева е софтуерен разработчик във фирма Солвер / Мидакс (www.midax.com). В момента следва специалност информатика във Факул­тета по математика и информатика на Софийски университет "Св. Климент Охридски". Моника има професионален опит в разработката за .NET Framework с езика C# и е сертифициран от Microsoft разработчик за .NET платформата. Нейните интереси са в областта на технологиите за изграж­дането на графичен пот­ребителски интерфейс и разработката на прило­жения за мобилни уст­ройства. През 2004 година Моника е асистент по "Структури от Данни" в Софийски университет.

Николай Недялков

Николай Недялков е президент на Асоциацията за информационна сигур­ност (www.iseca.org) която е създадена с цел прилагане на най-добрите практики за осигуряване на информационната сигурност на национално ниво и при извършването на електронен бизнес. Николай е професиона­лен разработчик на софтуер, консултант и преподавател с дългогодишен опит. Той е автор на статии и лектор на множество конференции и семи­нари в област­та на софтуерните техноло­гии и информационна си­гурност. Преподавателският му опит се простира от асистент по "Струк­тури от данни в програмирането", "Обектно-ориентирано програ­ми­ране със C++" и "Visual C++" до лектор в курсовете "Мрежова сигур­ност", "Сигурен програмен код", "Интернет програмиране с Java", "Кон­струиране на качествен програмен код", "Програмиране за платформа .NET" и "Раз­работка на приложения с Java". Интересите на Николай са концентрирани върху техническата и бизнес страната на информацион­ната сигурност, Java и .NET технологиите и моделирането и управлението на бизнес про­цеси в големи организации. Николай има бакалавърска степен от Факул­тета по математика и информатика на Софийски университет "Св. Климент Охридски". Като ученик е дългогодишен състеза­тел по програмиране, с редица призови отличия. През 2004 г. е награден от Президента на България Георги Първанов за приноса му към развитието на информаци­онните технологии и информационното общество. Той е почетен член на БАРС. Личният му сайт е достъпен от адрес: www.nedyalkov.com.

Панайот Добриков

Панайот Добриков е софтуерен архитект в SAP A.G., Java Server Technology (www.sap.com), Германия и е отговорен за координа­цията на софтуерните разработки в SAP Labs България. Той е завършил Факултета по математика и информатика на Софийски университет "Св. Климент Охридски", специалност информатика. Панайот е дългогодишен участник (като състе­зател и ръководител) в ученически и студентски състезания по програми­ране и е носител на много престижни награди в страната и чужбина. Той е автор на книгите "Програмиране = ++Алгоритми;" (www. algoplus.org) и "Java Programming with SAP Web Application Server", както и на десетки научно-технически публикации. През периода 2001-2003 води курсовете "Проек­ти­ране и анализ на компютърни алгоритми" и "Прагматика на обектното програмиране" в Софийски университет. Може­те да се свържете с Панайот по e-mail: dobrikov@gmail.com.

Преслав Наков

Преслав Наков е аспирант по изкуствен интелект в Калифорнийския университет в Бъркли (www.berkeley.edu), САЩ. Неговият профе­сионален опит включва шестгодишна работа като софтуерен разработчик във фир­мите Комсофт (www.comsoft.bg) и Рила Солюшънс (www.rila.bg). Инте­ре­сите му са в областта на компютърната лингвистика и биоинформа­тикатa. Преслав получава магистърската си степен по информатика от Софийски университет "Св. Климент Охридски". Той е носител е на бронзов медал от Балканиада по инфор­матика, заемал призови места в десетки национални състезания по прог­рамиране като ученик и студент. Състезател е, а по-късно и тре­ньор на отбора на Софийския университет, участник в Светов­ното между­университетско състезание по програмиране (ACM International Collegiate Programming Contest). Той е асистент в мно­жество курсове във Факултета по математика и информатика на Софийски университет, лектор-основател на курсовете "Проектиране и анализ на компютърни алгоритми" и "Моделиране на данни и проектиране на бази от данни". Преслав е автор на книгите "Основи на компютър­ните алгорит­ми" и "Прог­рамиране = ++Алгоритми;" (www.algoplus.org). Той има десетки научни и научнопопулярни публикации в престижни между­народни и национални издания. Той е първият носител на наградата "Джон Атанасов" за принос към развитието на информационните техно­логии и информационното общество, учредена от президента на България Георги Първанов.

Радослав Иванов

Радослав Иванов е софтуерен разработчик във фирма Медсофт (www.  medsoft.biz) и студент в специалност информатика във Факултета по мате­матика и информатика на Софийски университет "Св. Климент Охридски". Професио­налните му интереси са в областта на информационната сигур­ност и про­дуктите и технологиите на Microsoft.

Рослан Борисов

Рослан Борисов е софтуерен инженер във фирма Сирма Груп (www.sirma.bg), звено на Сирма Бизнес Консултинг. Професионалните му интереси са свързани основно с изграждане на приложения, базирани на технологии на Microsoft. Специализирал е в областта на билинг системи, като и основни и сателитни банкови системи. Има сериозен опит с платформата .NET Framework и сървърите за бази от данни Microsoft SQL Server и Oracle. Участва в различни проекти, свързани с български и чужди банки. В момента Рослан е студент в Нов български университет, специалност информатика. Можете да се свържете с него на e-mail: rosborisov@gmail.com.

Светлин Наков

Светлин Наков е директор на направление "обучение" на Националната академия по разработка на софтуер (http://academy.devbg.org), където обучава софтуерни специа­листи за практическа работа в ИТ индустрията с Java и .NET платформите. Той е хоноруван пре­подавател по съвременни софтуерни технологии в Софийски университет "Св. Климент Охридски", където води курсове по "Проектиране и анализ на компютърни алго­ритми", "Интернет програмиране с Java", "Мрежова сигурност", "Програми­ране за .NET Framework", "Качествен програмен код" и "Разработка на уеб приложения с Java". Светлин има сериозен професио­нален опит като софтуерен разра­ботчик и консултант. Неговите интереси обхващат Java технологиите, .NET платформата и информационната сигурност. Той е завършил бакалавър­ската и магистърската си степен във Факултета по математика и информа­тика на Софийски университет "Св. Климент Охридски". Като ученик и студент Светлин е победител в десетки национални състе­зания по програ­миране и е носител на 4 медала от международни олимпи­ади по информа­тика. Той има десетки научни и технически публикации, свързани с раз­работката на софтуер, в български и чуждестранни списа­ния и е автор на книгите "Интернет програмиране с Java", "Java за цифрово подпис­ване на документи в уеб" и ръководител на двата тома на настоящата книга. През 2003 г. той е носител на наградата "Джон Атанасов" на фондация Еврика. През 2004 г. получава награда "Джон Атанасов" от президента на България Георги Първанов за приноса му към развитието на информационните тех­нологии и информа­ционното общест­во. Светлин е един от учредителите на Българската асо­циация на разра­ботчиците на софтуер (www.devbg.org) и понастоящем неин пред­седател.

Стефан Добрев

Стефан Добрев е старши уеб разработчик във фирма Vizibility (www.vizibility.net). Той отговаря за голяма част от .NET продук­тите, раз­работвани в софтуерната компания, в това число уеб базирана система за изграждане на динамични сайтове и управление на тяхното съдържание, уеб система за управление на контакти и др. Негова отго­ворност е и внедряването на утвърдените практики и методологии за раз­работка на софтуер в производствения процес. Професионалните му интереси са насочени към уеб технологиите, в частност ASP.NET, XML уеб услугите и цялостната разработка на приложения, базирани на .NET Framework. Стефан следва информа­тика във Факултета по математика и информатика на Софийски университет "Св. Климент Охридски".

Стефан Кирязов

Стефан Кирязов е софтуерен разработчик във фирма Верео Технолъджис (www.vereo.bg). Той се занимава професионално с разработка на .NET решения за бизнеса и държавната администрация. Опитът му включва изграждане на уеб и настолни приложения с технологии на Microsoft, а също и Java и Oracle. Завършил е Факултета по математика и информа­тика на Софийски университет "Св. Климент Охридски", специалност информатика. Неговите професионални интереси включват архитектура, дизайн и методологии за разработка на големи корпоративни приложения. За контакти със Стефан можете да използвате неговия e-mail: stefan.kiryazov@gmail.com.

Стефан Захариев

Стефан Захариев работи като софтуерен разработчик в Интерконсулт България (www.icb.bg), където е отговорен за създаването на инструменти за автоматизиране на процеса на разработка. Той има дълго­годишен опит в създаването на ERP системи, който натрупва при работата си в различни фирми в България. Основните му интереси са свързани със системите за управление на бази от данни, платформата .NET, ORM инструментите, J2ME, както и Borland Delphi. При завършването си на средното образова­ние в "Технологично училище – Електронни системи", печели отличителна награда за цялостни постижения. През 2005 г. завър­шва "Технически университет – София", където се дипломира като бака­лавър във факулте­та по "Компютърни системи и управление". Той членува в БАРС и в Софийската .NET потребителска група Можете да се свържете със Стефан по e-mail: stephan.zahariev@gmail.com.

Стоян Дамов

Стоян Дамов е софтуерен консултант, пич, поет и революционер. Можете да се свържете с него по e-mail: stoyan.damov@gmail.com или от неговия личен сайт: http://spaces.msn.com/members/stoyan/.

Тодор Колев

Тодор Колев е софтуерен разработчик в Gugga (www.gugga.com) и сту­дент във Факултета по математика и информатика на Софийски универ­ситет "Св. Климент Охридски", специалност Информатика. Неговите про­фесио­нални интереси са в областта на обектно-ориентирания анализ, моделиране и програми­ране, уеб технологиите, базите данни и RIA (Rich Internet Applications). Тодор е дългогодишен участник в състезания по информатика и информа­ционни технологии, печелил редица грамоти и отличия, както и сребърен медал на международна олимпиада по инфор­мационни технологии. Той е носител на първо място от националната олимпиада по информационни технологии и е участвал в журито на същата олимпиада година по-късно. Тодор има множество разработки в сферата на уеб технологиите и е участвал в изследователски екип в Масачузетският технологичен инсти­тут (MIT). Той е сертифициран Microsoft специалист.

Христо Дешев

Христо Дешев е разработчик на ASP.NET компоненти във фирма telerik (www.telerik.com). Той е завършил Американския университет в България, специалност информатика. Основните му интереси са в областта на подо­бряването на процеса на разработка на софтуер. Той е запален привър­женик на Agile методологиите, основно на Extreme Programming (XP). Про­фесионалният му опит е предимно в разработката на решения с кратък цикъл за обратна връзка, високо покритие от тестове и почти пълна автоматизация на всички нива от работния процес.

Христо Радков

Христо Радков е управител на фирма за софтуерни консултантски услуги Calisto ID (www.calistoid.com). Той е бакалавър от английската специал­ност "Manufacturing Engineering" в Технически Университет – София и магистър по информаци­онни и комуникационни технологии във Факултета по математика и информатика на Софийски университет "Св. Климент Охридски". Притежава сертификационна степен от Microsoft - MCSD.NET.  Христо има дългогодишен опит с различни сървъри за бази от данни и сериозен опит с различни технологии на Microsoft, Borland, Sun и Oracle. Участник и ръководител е в проекти за изграждане на няколко големи информа­ционни системи, динамични Интернет портали и др. Под негово ръковод­ство е създаден най-успешния складово-счетоводен соф­туер за фарма­цевтични предприятия в страната. Като ученик Христо има множес­тво участия и награди от олимпиади по мате­матика в страната и чужбина.

Цветелин Андреев

Цветелин Андреев е софтуерен инженер във фирма Dreamix Ltd. (www.dreamix.eu). Той е член на Българската асо­циация на разработчи­ците на софтуер и е инструктор към Националната академия по разработ­ка на софтуер. Цветелин участва като лектор в редица курсове и семи­нари. Изявява се и като консултант по използване на модерни уеб техно­логии. Част от интересите му са свързани с платформата FreeBSD, в част­ност използването й за разработка на софтуер. Член е на групата на бъл­гарските потребители на FreeBSD (freebsd-bg.org). Цветелин е завършил бакалавърска степен по информатика във Факултета по математика и информатика на Софийски университет "Св. Климент Охридски", а сега е студент по Стопанско Управление в същия университет. Личният му уеб сайт е достъпен от адрес: www.flowerlin.net.

Явор Ташев

Явор Ташев е софтуерен разработчик във фирма ComMetric (www. commetric.com). Той е завършил Факултета по математика и информа­тика на Софийски университет "Св. Климент Охридски", специалност информа­тика. Участвал е в разработката на големи корпоративни сайтове, комуни­ка­ционни системи и решения за обработка на статистически данни и прогнозиране с методи на изкуствен интелект, използвайки технологиите и платформите на Microsoft. Интере­сите му са насо­чени към .NET платфор­мата, Java и из­куствения интелект. Професионал­ният му опит е свързан предимно с .NET Framework, Visual Studio .NET, Microsoft SQL Server и Microsoft Internet Information Server.

Благодарности

Настоящата книга стана реалност благодарение на много хора и няколко организации, които помогнаха и допринесоха за проекта. Нека изкажем своята благодарност и уважение към тях.

Светлин Наков

На първо място трябва да благодарим на главния орга­низатор и ръково­дител на проекта, Светлин Наков, който успя да мотивира над 30 души да участват в начи­нанието и успя да ги ръководи успешно през всичките месеци на работата по проекта. Той успя да реализира своята идея за създаване на чисто българска книга за програмиране с .NET Framework най-вече благодарение на всички доб­роволни участници, които дариха своя труд за проекта и отделиха от малкото си свободно време за да спо­делят своите знания и опит безвъзмездно, за каузата.

Авторският колектив

Авторският колектив е наистина главният виновник за съществуването на тази книга. Текст с такъв обем и такова качество не може да бъде написан от един или двама автора за по-малко от няколко години, а до тогава инфор­мацията може вече да остаряла.

Идеята за участие на толкова много автори се оказа успешна, макар и координацията между тях да не беше лесна. Въпреки, че отделните глави от книгата са писани от различни автори, те следват единен стил и високо качество. Всички глави са добре структурирани, с много заглавия и подза­главия, с много и подходящи примери, с добър стил на изказ и еднакво форматиране.

Българска асоциация на разработчиците на софтуер

Проектът получи силна подкрепа от Българската асоциация на разработ­чиците на софтуер (БАРС), тъй като е в синхрон с нейните цели и идеи.

БАРС официално държи правата за издаване и разпространение на кни­гата в хартиен вид, но няма право да реализира печалба от тази дей­ност. Асоциацията чрез своите контакти успя да намери финансиране за отпе­чатването на книгата, както и хостинг за нейния уеб сайт и форум.

Microsoft Research

В ранните си фази, когато бяха изготвени лекциите за курса "Програ­миране за .NET Framework", проектът получи подкрепа и частично финан­сиране от Microsoft Research. Ако не беше тази подкрепа, вероятно няма­ше да се стигне до създаването на лекциите и до написването на книгата.

SciForge.org

Порталът за организиране на работата в екип SciForge.org даде своя при­нос към проекта, като предостави среда за съвместна работа, включваща система за контрол над версиите, форум, пощенски списък (mailing list) и някои други средства за улеснение на работата.

Благодарностите са отправени главно към създателя на портала и негов главен администратор Калин Наков (www.kalinnakov.com), който указваше редовно съдействие в случай на технически проблеми.

Софийски университет "Св. Климент Охридски"

Факултетът по математика и информатика (ФМИ) на Софийски универ­ситет "Св. Климент Охридски" подпомогна проекта глав­но в началната му фаза, като подкрепи предложението на преподавателския екип от курса "Програми­ране за платформа .NET" за участие в конкурса на Microsoft Research. По-късно факултетът продължи да подкрепя инициативите на авторския колектив на книгата като им позволи да провеждат изборни курсове по програмиране за .NET Framework 1.1 и 2.0 за студентите от Софийски университет.

telerik

Софтуерната компания telerik (www.telerik.com) подкрепи проекта чрез осигуряване на финансиране за отпечатване на книгата на хартия. Изказ­ваме благодарности от името на целия авторски колектив.

Сайтът на книгата

Официалният уеб сайт на книгата "Програмиране за .NET Framework" е достъпен от адрес: http://www.devbg.org/dotnetbook/. От него можете да изтеглите цялата книга в електронен вид, лекциите, на които тя е бази­рана, както и сорс кода на практическия проект от глава 29, за който има специално изготвена инсталираща програма.

Към книгата е създаден и дискусионен форум, който се намира на адрес: http://www.devbg.org/forum/index.php?showforum=30. В него можете да дискутирате всякакви технически и други проблеми, свързани с книгата, да отправяте мнения и коментари и да задавате въпроси към авторите.

Лиценз

Книгата и учебните материали към нея се разпространяват свободно по следния лиценз:

Общи дефиниции

1.   Настоящият лиценз дефинира условията за използване и разпрост­ранение на комплект учебни материали и книга по "Програмиране за .NET Framework", разработени от екип под ръководството на Светлин Наков (www.nakov.com) с подкрепата на Българска асоциа­ция на разработ­чиците на софтуер (www.devbg.org) и Microsoft Research (research.microsoft.com).

2.   Учебните материали се състоят от:

-        презентации;

-        примерен сорс код;

-        демонстрационни програми;

-        задачи за упражнения;

-        книга (учебник) по програмиране за .NET Framework с езика C#.

3.   Учебните материали са достъпни за свободно изтегляне при усло­вията на настоящия лиценз от официалния сайт на проекта:

http://www.devbg.org/dotnetbook/

4.   Автори на учебните материали са лицата, взели участие в тяхното изработване. Всеки автор притежава права само над продуктите на своя труд.

5.   Потребител на учебните материали е всеки, който по някакъв начин използва тези материали или части от тях.

Права и ограничения на потребителите

1.   Потребителите имат право:

-        да използват учебните материали или части от тях за всякакви цели, включително да ги да променят според своите нужди и да ги използват при извършване на комерсиална дейност;

-        да използват сорс кода от примерите и демонстрациите, включени към учебните материали или техни модификации, за всякакви нужди, включително и в комерсиални софтуерни продукти;

-        да разпространяват безплатно непроменени копия на учебните материали в електронен или хартиен вид;

-        да разпространяват безплатно оригинални или променени части от учебните материали, но само при изричното споменаване на източника и авторите на съответния текст, програмен код или друг материал.

2.   Потребителите нямат право:

-        да разпространяват срещу заплащане учебните материали или части от тях (включително модифицирани версии), като изклю­чение прави само програмният код;

-        да премахват настоящия лиценз от учебните материали.

Права и ограничения на авторите

1.   Всеки автор притежава неизключителни права върху продуктите на своя труд, с които взима участие в изработката на учебните мате­риали.

2.   Авторите имат право да използват частите, изработени от тях, за всякакви цели, включително да ги изменят и разпространяват срещу заплащане.

3.   Правата върху учебните материали, изработени в съавторство, са притежание на всички съавтори заедно.

4.   Авторите нямат право да разпространяват срещу заплащане учебни материали или части от тях, изработени в съавторство, без изрич­ното съгласие на всички съавтори.

Права и ограничения на БАРС

Ръководството на Българска асоциация на разработчиците на софтуер (БАРС) има право да разпространява учебните материали или части от тях (включително модифицирани) безплатно или срещу заплащане, но без да реализира печалба от продажби.

Права и ограничения на Microsoft Research

Microsoft Research има право да разпространява учебните материали или части от тях по всякакъв начин – безплатно или срещу заплащане, но без да реализира печалба от продажби.

 

Светлин Наков,

01.11.2006 г.


Глава 15. Изграждане на графичен потребителски интерфейс с Windows Forms

Автори

Светлин Наков

Радослав Иванов

Необходими знания

-        Базови познания за .NET Framework

-        Базови познания за езика C#

-        Базови познания за делегатите и събитията в .NET Framework

-        Начални умения за работа с Visual Studio .NET и Windows Forms редактора му

Съдържание

-        Какво е Windows Forms?

-        Програмни компоненти. Компонентен модел на .NET

-        Програмен модел на Windows Forms. Модел на пречертаване на контролите

-        Основни класове. Йерархия на класовете

-        Класът Control. Други базови контроли

-        Форми, прозорци и диалози – класът Form

-        Основни контроли – TextBox, Label, Button

-        Поставяне на контроли във формата

-        Управление на събитията

-        Windows Forms редакторът на VS.NET

-        Стандартни диалогови кутии

-        Извикване на диалогови кутии

-        Други Windows Forms контроли. Менюта. Ленти с инструменти. Статус ленти

-        Диалог за избор на файл

-        MDI приложения

-        Валидация на данни

-        Свързване на данни (Data Binding). Навигация с CurrencyManager

-        Контролата DataGrid

-        Master-Details навигация

-        Наследяване на форми

-        Пакетът System.Drawing и GDI+

-        Печатане на принтер

-        Потребителски контроли

-        Хостинг на контроли в Internet Explorer

-        Нишки и Windows Forms

-        Влачене (Drag and Drop)

-        Конфигурационен файл на приложението

В тази тема ...

В настоящата тема ще разгледаме средствата на Windows Forms за създа­ване на прозоречно-базиран графичен потребителски интерфейс (GUI) за .NET приложенията. Ще се запознаем с програмния модел на Windows Forms, неговите базови контроли, средствата за създаване на прозорци, диалози, менюта, ленти с инструменти и статус ленти, както и с някои по-сложни концепции: MDI приложения, data-binding, наследяване на форми, хостинг на контроли в Internet Explorer, работа с нишки в Windows Forms и др.


Какво е Windows Forms?

Windows Forms е стандартната библиотека на .NET Framework за изграж­дане на прозоречно-базиран графичен потребителски интерфейс (GUI) за настолни (desktop) приложения. Windows Forms дефинира набор от класове и типове, позволяващи изграждане на прозорци и диалози с графични контроли в тях, чрез които се извършва интерактивно взаимо­дей­ствие с потребителя.

При настолните приложения графичният потребителски интерфейс позво­лява потребителят директно да взаимодейства с програмата чрез мишката и клавиатурата, а програмата прихваща неговите действия и ги обработва по подходящ начин.

Windows Forms е базирана на RAD концепцията

В .NET Framework и особено в Windows Forms се поддържа концепцията за Rapid Application Development (RAD).

Какво е RAD?

RAD е подход за разработка, при който приложенията се създават визу­ално чрез сглобяване на готови компоненти посредством помощници и инструменти за автоматично генериране на голяма част от кода. В резул­тат приложенията се разработват много бързо, с малко ръчно писане на код и с намалени усилия от страна на програмиста.

При компонентно-ориентираната разработка всеки компонент решава някаква определена задача, която е част от проекта. Компонентите се поставят в приложението, след което се интегрират един с друг чрез настройка на техните свойства и събития. Свойствата на всеки компонент определят различни негови характеристики, а събитията служат за управ­ление на действията, които са предизвикани от него.

Windows Forms позволява бърза визуална разработка

Windows Forms е типична компонентно-ориентирана библиотека за създа­ване на GUI, която предоставя възможност с малко писане на програмен код да се създава гъвкав графичен потребителски интерфейс.

Windows Forms позволява създаването на формите и другите елементи от графичния интерфейс на приложенията да се извършва визуално и интуи­тивно чрез подходящи редактори, като например Windows Forms Designer във Visual Studio .NET. По-нататък в настоящата тема ще разгледаме по-подробно конкретните въз­можности, които VS.NET предоставя за създа­ване на Windows Forms приложения.

Windows Forms и другите библиотеки за изграждане на GUI

Windows Forms прилича на много други библиотеки за изграждане на графичен потребителски интерфейс (GUI), но и сериозно се различава от повечето от тях.

Windows Forms и VCL

На идейно ниво Windows Forms много прилича на библиотеката Visual Component Library (VCL) от Delphi. Приличат си в голяма степен дори самите контроли, техните имена, свойства и събития. Това вероятно се дължи до голяма степен на участието на главния архитект на Delphi Андерс Хейлсбърг в разработката на Windows Forms и .NET Framework.

Windows Forms и Visual Basic 6

По начина на разработка Windows Forms прилича много и на Visual Basic 6, който позволява визуално изграждане на интерфейса, чрез влачене на компоненти и настройка на свойства и събития, също както в Delphi.

Windows Forms и MFC

По своята мощ Windows Forms не отстъпва на по-старите средства за изграждане на GUI, например MFC (Microsoft Foundation Classes) библиоте­ката, която се използваше във Visual C++ преди Microsoft да вземат стратегическото решение разработката на GUI за Windows да преминава постепенно към .NET Framework и Windows Forms.

За разлика от MFC, при Windows Forms, интерфейсът се изгражда няколко пъти по-бързо, по-лесно и почти без да се пише програмен код.

Windows Forms и Java AWT/Swing

AWT и Swing са библиотеки за изграждане на прозоречно-базиран GUI, които се използват при Java платформата. Програмният модел на Windows Forms има съществени разлики от програмния модел на AWT и Swing и причините за това произхождат най-вече от факта, че AWT и Swing са преносими библиотеки, предназначени да работят на много операционни системи, докато Windows Forms е базирана на Win32 API.

Контролите в Windows Forms

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

В Интернет могат да се намерят безплатно или срещу лицензна такса голям брой библиотеки от контроли, които решават често срещани проб­леми и спестяват време на разработчика при реализацията на често сре­щани задачи. Съществуват дори цели софтуерни компании, които профе­сионално се занимават с производството на компоненти и контроли (като Infragistics, ComponentOne и българската telerik).

Windows Forms и работа с данни

Windows Forms предоставя много контроли за визуализация и редактира­не на данни – текстови, списъчни и таблични. За спестяване на време на разработчика е въведена концепцията "свързване на данни" (data binding), която позволява автоматично свързване на данните с контролите за тяхната визуализация. Ще обърнем специално внимание на концепци­ята "data binding" по-късно в настоящата тема.

Вградена поддръжка на Unicode

В Windows Forms поддръжката на Unicode е вградена. Всички контроли са съобразени с Unicode стандарта и позволяват използване на много езици и азбуки (латиница, кирилица, гръцки, арабски и др.) без допълнителни настройки на Windows или на приложението.

Наследяване на форми и контроли

Windows Forms е проектирана така, че да позволява лесно наследяване и разширяване на форми и контроли. Това дава възможност за преизполз­ване на общите части на потребителския интерфейс. По-нататък в настоя­щата тема ще демонстрираме как точно се реализира това.

ActiveX контроли

Преди появата на .NET Framework Windows приложенията са били бази­рани на програмния модел "Win32". В Win32 среда се използват т. нар. ActiveX контроли, които се реализират чрез компонентния модел на Windows (COM – Component Object Model).

ActiveX контролите представляват графични компоненти. Те имат свой­ства, чрез които им се задават различни характеристики, и събития, управляващи поведението им.

ActiveX контролите много приличат на Windows Forms контролите от .NET Framework, но за разлика от тях се реализират с неуправляван код и преди използване трябва да се регистрират чрез добавяне в регистрите на Windows (Windows Registry).

Поради дългия период на развитие на Win32 платформата, има изключи­телно много ActiveX контроли, които са създадени с течение на годините от различни софтуерни производители.

В .NET Framework по лесен начин, без да се пише ръчно програмен код, могат да се използват вече разработени ActiveX контроли. Например можем да вградим уеб браузъра Internet Explorer или четеца на PDF документи Adobe Acrobat Reader като част от наше приложение. Как точно се използват ActiveX контроли в Windows Forms ще разгледаме в темата "Взаимодействие с неуправляван код".

Печатане на принтер

В Windows Forms са предоставени удобни средства за печатане на доку­менти на принтер. Те предоставят достъп до всички стандартни диалози за печат, чрез които потребителите избират печатащо устройство и настрой­ват неговите характеристики. Самото печатане се извършва със стандарт­ните средства­ на .NET Framework за чертане върху повърхности.

Windows Forms контроли в Internet Explorer

При проектирането на .NET Framework е заложено Windows Forms контро­лите да могат да се изпълняват в средата на Internet Explorer или други уеб браузъри, без да се застрашава сигурността на потребителя.

Тази технология е една добра съвременна алтернатива на Java аплетите и позволява разширяване на функционалността на уеб приложенията с гъвкав интерактивен потребителски интерфейс. На практика се дава въз­можност .NET приложения да се изпълняват в браузъра на клиента като се вградят в най-обикновена уеб страница (подобно на Flash технологията).

Силна поддръжка на графика (GDI+)

Библиотеката Windows Forms широко използва средствата на Windows плат­формата за чертане и работа с графични обекти (GDI+). Windows Forms позволява тези средства да се използват за създаване на собствени изображения върху различни повърхности – в прозорец, върху принтер, плотер и др. Дава се достъп до всички по-важни примитиви за чертане –текст, графични изображения, геометрични фигури (точки, линии, право­ъгълници, елипси) и т. н.

Нашето първо Windows Forms приложение

За да илюстрираме как се използва на практика Windows Forms, да разгледаме следното просто приложение:

using System;

using System.Windows.Forms;

 

public class SampleForm : System.Windows.Forms.Form

{

  static void Main()

  {

     SampleForm sampleForm = new SampleForm();

     sampleForm.Text = "Sample Form";

     Button button = new Button();

     button.Text = "Close";

     button.Click +=

       new EventHandler(sampleForm.button_Click);

     sampleForm.Controls.Add(button);

     sampleForm.ShowDialog();

     sampleForm.Dispose();

  }

 

  private void button_Click(object sender, EventArgs e)

  {

     Close();

  }

}

В него се създава прозорец, който съдържа бутон с текст "Close". При натискане на бутона прозорецът се затваря (това се реализира чрез при­хващане и обработка на събитието "натискане на бутона").

Как да компилираме и стартираме примера?

За да компилираме горното приложение, можем да ползваме конзолния компилатор на .NET Framework за езика C#:

csc SampleForm.cs

Можем да компилираме примера и от VS.NET, но за целта трябва да създадем нов Windows Application проект и да копираме кода в него.

При изпълнение на приложението се получава следния резултат:

Как работи примерът?

Нашето първо Windows Forms приложение е доста просто. То е изградено по следния начин:

-        Дефиниран е клас SampleForm, който наследява класа System. Windows.Forms.Form. Този клас представлява главната форма на приложението.

-        В главния метод Main() първо се задава заглавие за формата. След това се създава бутон, който се добавя в списъка с контролите на формата и се прихваща събитието "щракване върху бутона". Накрая формата се показва в модален режим (модален режим означава, че другите форми на приложението не са активни, докато не се затвори текущата) и след затварянето й се унищожава.

-        При натискане на бутона се извиква събитие, което затваря формата, и приложението завършва.

Примерът е доста прост и показва основните моменти при изграждането на потребителски интерфейс с Windows Forms – създаване на форми, поставяне на контроли във формите, настройка на свойствата на контро­лите, прихващане и обработване на събития.

Библиотеките на .NET за изграждане на GUI

Средствата на .NET Framework за изграждане на графичен потребителски интерфейс са дефинирани в пространствата от имена System.Drawing и System.Windows.Forms, които са реализирани съответно в асемблитата System.Drawing.dll и System.Windows.Forms.dll. Тези пространства за­едно с пространствата, съдържащи се в тях, са изобразени на фигурата:

Пространството System.Windows.Forms

Класовете и типовете от пространството System.Windows.Forms осигу­ря­ват средства за работа с прозорци, диалози, контроли за въвеж­дане на текст, контроли за избор, менюта, ленти с инструменти, таблици, дървета и др.

Пространството System.Windows.Forms.Design

Пространството System.Windows.Forms.Design съдържа класове, които поддържат конфигурирането на компонентите и дефинират поведението на Windows Forms контролите по време на дизайн.

Пространството System.Drawing

Класовете и типовете от пространството System.Drawing и неговите под­пространства осигуряват достъп до GDI+ функциите на Windows: работа с повърхности, точки, линии, четки, моливи, геометрични фигури, картин­ки, текст и шрифтове и др.

Програмни компоненти

В софтуерното инженерство компонентите са преизползваеми (reusable) програмни единици (класове), които решават специфична задача. Всеки компонент има ясно дефиниран интерфейс, който описва неговите свой­ства, методи и събития. Компонентите се използват като части от други компоненти или програми – те са градивните елементи на софтуера.

Компонентен модел

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

Компонентният модел на .NET Framework

Компонентният модел на .NET Framework дефинира програмния модел (система от правила) за създаване и използване на .NET компоненти. Този програмен модел се реализира чрез определени класове и интерфейси, които поддържат описанието на компонентите.

В .NET Framework компонентният модел позволява дефиниране на пове­дението на компонентите по време на дизайн (design-time behavior) и по време на работа (runtime behavior).

Компоненти и контейнери

В .NET Framework са дефинирани два вида преизползваеми обекти: ком­поненти и контейнери. Компонентите са функционални единици, които решават някаква задача, а контейнерите са обекти, които съдържат спи­сък от компоненти.

Преизползваемост на компонентите

Благодарение на междуезиковата съвместимост, която CLR осигурява, .NET компонентите могат директно да се преизползват във всички .NET езици за програмиране. Възможно е .NET компоненти да бъдат използвани и от Win32 приложения, но за целта трябва да се публикуват във вид на COM обекти.

Пространството System.ComponentModel

Компоненти се използват не само в Windows Forms, а навсякъде в .NET Framework. По тази причина основната функционалност на компонентния модел на .NET се намира в пространството System.ComponentModel. В него са дефинирани основните интерфейси IComponent и IContainer и техните имплементации Component и Container.

Windows Forms и компонентният модел на .NET

В архитектурата на Windows Forms залягат концепциите на компонентния модел на .NET Framework. Компонентният модел на .NET дефинира компо­ненти и контейнери. По подобен начин Windows Forms дефинира контроли и контейнер-контроли.

Контроли и контейнер-контроли

Контролите в Windows Forms са всички компоненти, които са видими за потребителя (имат графично изображение). Те биват два вида: контей­нер контроли (форми, диалози, панели и т.н.) и контроли (бутони, тексто­ви полета, етикети, списъчни контроли и т.н.). Контейнерите са предназ­начени да съдържат в себе си други контроли (включително и други кон­тейнер контроли), докато контролите са предназначени да се съдържат в контей­нер контролите.

В Windows Forms всяка контрола може да се използва като контейнер-контрола, но за някои контроли това е безсмислено. Няма смисъл и не е правилно в бутон да се поставят други бутони или текстови полета.

Програмен модел на Windows Forms

Програмният модел на Windows Forms дефинира класовете за работа с форми, диалози и контроли, събитията на контролите, жизнения цикъл на приложенията, модела на пречертаване на контролите, модела на получа­ване и обработка на събитията и модела на управление на фокуса. Нека разгледаме всички тези елементи от програмния модел.

Форми

Windows Forms предлага стандартни класове за работа с форми (това са прозорците и диалозите в GUI приложенията). Формите могат да бъдат модални и немодални (по една или по много активни едновременно). Формите са контейнер-контроли и могат да съдържат други контроли, например етикети, текстови полета, бутони и т.н. Базов клас за всички форми е класът System.Windows.Forms.Form.

Контроли

Контролите в Windows Forms са текстовите полета, етикетите, бутоните, списъците, дърветата, таблиците, менютата, лентите с инструменти, статус лентите и много други. Windows Forms дефинира базови класове за кон­тролите и класове-наследници за всяка контрола. Базов клас за всички контроли е класът System.Windows.Forms.Control. Пример за контрола е например бутонът (класът System.Windows.Forms.Button).

Събития

Всички контроли от Windows Forms дефинират събития, които програмис­тът може да прихваща. Например контролата Button дефинира събитието Click, което се активира при натискане на бутона. Събитията в Windows Forms управляват взаимодействието между програмата и контролите и между самите контроли.

Жизнен цикъл на Windows Forms приложенията

Жизненият цикъл на GUI приложенията е базиран на съобщения. Графич­ната среда на операционната система прихваща всички потребителски действия (напр. движението на мишката, натискането на клавиши от клавиатурата и т.н.) и ги натрупва в специална опашка. След това всяко съобщение се предава към приложението, за което се отнася и по-точно към нишката (thread) от приложението, за която се отнася.

Нишки и многозадачност

В многозадачните операционни системи (каквито са например Windows и Linux) е възможно едно приложение да изпълнява няколко задачи пара­лелно, като използва няколко нишки (threads) в рамките на процеса, в който работи програмата.

За целите на настоящата тема можем да си мислим, че нишките са нещо като отделни задачи в програмата, които се изпълняват едновременно (паралелно) в даден момент. По-нататък, в темата "Многонишково програ­миране и синхронизация", ще обърнем специално вни­мание на многоза­дачността, използването и синхронизацията на нишки.

Опашката от събития

Всяка нишка от всяко приложение си има своя собствена опашка, в която постъпват съобщенията за всички събития, идващи от потребителя или от други източници. Всяко съобщение носи информация за събитието, което е настъпило – часът на настъпване, идентификатор на прозорец, за който се отнася събитието, тип на събитието, параметри на събитието (напр. номер на натиснатия клавиш при събитие от клавиатурата или позиция на курсора при събитие от мишката) и т.н. В Windows Forms съобщенията са инстанции на структурата System.Windows.Forms.Message.

Главната нишка на всяко Windows Forms приложение извършва една единствена задача: в безкраен цикъл обработва опашката от съобщения за приложението и предава постъпилите съобщения на контролата, за която са предназначени.

В Windows Forms приложенията винаги имат точно една нишка, която обработва всички съобщения, идващи от графичните контроли, и това е главната нишка на приложението. Графичният потребителски интерфейс на цялото приложение се управлява от тази нишка. При настъпване на събитие, свързано с някоя от формите на приложението или контролите в нея, в опашката на главната нишка постъпва съответно съобщение и то се обработва, когато му дойде редът.

Само главната нишка трябва да взаимодейства с опашката от събития

Много е важно, когато разработваме Windows Forms приложения, да се съобразяваме със следното правило:

Графичният потребителски интерфейс на приложението трябва да се управлява само и единствено от неговата главна нишка.

Ако не спазваме това правило, ще се сблъскаме с много странни и неприятни проблеми. Например, ако стартираме едновременно няколко нишки и от всяка от тях от време на време променяме съдържанието на определено текстово поле, е възможно в дадени моменти приложението да "зависва".

Всяка контрола обработва собствените си събития

Когато главната нишка на Windows Forms приложение получи съобщение, свързано с някоя от неговите форми, тя препраща съобщението до обра­ботчика на съобщения на съответната форма. Този обработчик от своя страна проверява дали съобщението е за самата форма или за някоя нейна контрола. Ако съобщението е за формата, то се обработва директно от съответния обработчик на събития. Ако съобщението е за някоя от контролите във формата, то се предава на нея. Контролата, която получи съобщението, може да е обикновена контрола или контейнер-контрола. Когато обикновена контрола получи съобщение, тя го обработва директ­но. Когато контейнер-контрола получи съобщение, тя проверява дали то е за нея или е за някоя от вложените контроли. Процесът продъл­жава, докато съобщението достигне до контролата, за която е предназ­начено.

По описаната схема всяко съобщение преминава от главната нишка на приложението през формата, за която се отнася, и евентуално през още една или няколко други контроли, докато си намери обработчика.

Обработка на събитие – пример

Нека имаме някакво приложение, което се състои от една форма, в която има един бутон. Да предположим, че натиснем левия бутон на мишката, докато курсорът е върху бутона във формата. Какво се случва?

Главната нишка на приложението получава съобщение "натиснат ляв бутон на мишка", в което са записани координатите, в които е бил курсорът на мишката в момента на натискането. Операционната система подава тези координати относително спрямо горния ляв ъгъл на формата.

Докато обработва съобщението, главната нишка на приложението открива формата, за която се отнася събитието (това е най-горната от всички форми, в които попада курсорът на мишката) и го предава на нейния обработчик на събития.

Формата получава съобщението и вижда, че то се отнася за някаква позиция, в която се намира някаква нейна контрола (в случая това е бутонът). Формата преценява, че съобщението не е за нея, а е за бутона, и му го предава.

Бутонът получава събитието и вижда, че то е предназначено точно за него. Събитието бива погълнато (консумирано) от обработчика на събития на бутона и съответно бутонът преминава в състояние "натиснат". Самият бутон малко след това изпраща събитие за пречертаване до самия себе си (на пречертаването ще обърнем внимание след малко). Когато това събитие достигне по същия път до бутона, той се пречер­тава в натиснато състояние.

Прекратяване на Windows Forms приложение

При затваряне на главната форма на Windows Forms приложение, към нея се изпраща съобщение за затваряне. Формата се затваря в момента, в който получи съобщението и го обработи. В резултат на затварянето на формата се прекратява цикълът, в който главната нишка на приложението обработва пристигащите за нея съобщения и приложението приключва изпълнението си.

Модел на пречертаване на контролите

В Windows Forms контролите често се пречертават, например при пре­местване на прозорец, при смяна на активния прозорец или при промяна на размера, позицията или състоянието на някоя контрола. При всяко от изброените действия една или няколко контроли, които попадат в обсега на даден засегнат регион, се обявяват за невалидни и се активира проце­сът на пречертаване.

Процесът на пречертаване

Процесът на пречертаване на контрола, която е засегната от промяна в нея самата, от промяна на контейнер-контролата, в която се намира, или от промяна в други съседни контроли, се извършва на два етапа:

1.   За контролата се извиква методът Invalidate(), който обявява за невалидна дадената контрола или отделен неин участък и изпраща заявка за пречертаване. Invalidate() реално маркира регионите от контролата, които по някаква причина имат нужда от пречертаване и след това й изпраща съобщение "пречертай" (WM_PAINT), което се изпълнява по-късно.

2.   В някакъв момент цикълът за обработка на съобщения на текущата нишка получава съобщението "пречертай" и в резултат изпълнява метода Paint() на съответната контрола. Този метод извършва самото графично обновяване на всички невалидни участъци от контролата или в частност я пречертава цялата.

Друг интересен метод, свързан с пречертаването на контролите, е Update() методът. Той може да се използва след Invalidate() за незабавно пречертаване на дадена контрола чрез насилствено извикване на Paint(), без да се изчаква Paint() да бъде извикан от цикъла за обработка на съобщения за текущата нишка.

Съобщението "пречертай"

Съобщението "пречертай" (WM_PAINT) е специално съобщение. То се обра­ботва последно, едва след като всички останали съобщения от опашката на главната нишка вече са обработени и в нея останат само съобщения "пречертай". Това осигурява намаляване на претрепванията на контроли­те, когато те се променят много пъти за кратко време.

Например, ако при обработката на дадено събитие на дадена контрола бъде изпратено 5 пъти съобщение "пречертай", контролата ще изпълни само едно пречертаване и то едва след като формата е обработила всички останали съобщения и е станало ясно кои контроли в момента са невалидни и трябва да се пречертаят.

Реалното графично изобразяване на заявените за пречертаване контроли се извършва, когато те обработват съобщението "пречертай", което може да е много след като пречертаването е заявено.

Когато се пречертават няколко контроли последователно, те винаги се пречертават в реда, в който контролите са поставени в контейнер-контролата (т. нар. Z-order). Първи се пречертават най-рано поставените контроли, а последни – най-късно поставените.

Реализация на пречертаването

Всяка Windows Forms контрола може да дефинира програмен код, който реализира изчертаването на нейното съдържание (метод Paint()).

Windows Forms контролите могат да се поставят една върху друга със застъпване. Понеже при пречертаване контролите се изобразяват една след друга по реда на поставянето им, ако има застъпвания, последно поставената контрола закрива (частично или напълно) всички контроли, с които се застъпва.

По-нататък в настоящата тема ще дадем примерен код, който реализира пречертаването на контрола чрез използване на графичните примитиви от GDI+.

Управление на фокуса и навигация

В една форма в даден момент може някоя от контролите да е активна, т.е. да държи фокуса. Контролата, която е на фокус, обикновено показва това по някакъв начин – бутонът променя графичния си вид, текстовото поле показва мигащ курсор и т.н.

При настъпване на събитие от клавиатурата, то се получава първо от контролата, която е на фокус. Например, ако едно текстово поле е на фокус и потребителят натисне клавиш, който съответства на някоя буква, текстовото поле обикновено приема буквата и я изписва на позицията на курсора. Ако текстовото поле не обработи натиснатия клавиш (например,  ако това е клавиш за навигация [Tab]), той се обработва от контейнер-контролата.

Windows Forms осигурява навигация между контролите чрез клавишите [Tab] и [Shift+Tab], които преместват фокуса към следващата или пред­ходната контрола. Коя е следващата и коя е предишната контрола се определя от т. нар. "Tab Order", който зависи от реда на поставяне на контролите във формата и от някои свойства на контролите.

Формите също могат да са на фокус (да са активни) или да не са. Фокусът между формите може да се променя от потребителя само при немодални форми. Модалните форми не позволяват друга форма да приема фокуса, докато не бъдат затворени.

Текущата фокусирана контрола и форма могат да се променят, както в резултат от потребителски действия от клавиатурата и мишката, така и програмно - чрез изпращане на подходящи съобщения или извикване на подходящи методи. Има контроли, които не могат да приемат фокуса, и контроли, които могат да го приемат, но се прескачат при натискане на [Tab] и [Shift+Tab].

Основни класове в Windows Forms

Библиотеката Windows Forms дефинира съвкупност от базови класове за контролите, контейнер-контролите, както и множество графични контроли и неграфични компоненти.

Основните базови класове, използвани в Windows Forms, са:

-        System.ComponentModel.Component – представлява .NET компонент. Използва се за реализацията на неграфични компоненти. Например компонентата System.Windows.Forms.Timer е наследник на класа Component.

-        System.Windows.Forms.Control – представлява графична контрола. Графични контроли са компонентите, които имат графичен образ. Всички Windows Forms контроли са наследници на класа Control, включително и контейнер-контролите.

-        System.Windows.Forms.ScrollableControl – представлява контрола, която поддържа скролиране на съдържанието си. Може да съдържа в себе си други контроли.

-        System.Windows.Forms.ContainerControl – представлява контрола, която съдържа в себе си други контроли и осигурява управление на фокуса. Не всички контейнер-контроли наследяват този клас. Напри­мер панелът (System.Windows.Forms.Panel) може да съдържа в себе си други контроли, но е наследник на класа ScrollableControl, а не на ContainerControl.

Йерархия на класовете

На клас-диаграмата по-долу е показана част от класовата йерархия на библиотеката Windows Forms:

Забелязва се, че не всички класове от Windows Forms са контроли. Някои са обикновени .NET компоненти, например Menu, Timer и ImageList. Из­глежда малко странно защо менюто не е контрола, но това е така, защото компонентата Menu реално няма графичен образ и представлява списък от MenuItem елементи. MenuItem класът вече има графичен образ и следова­телно е контрола.

Типичните контроли (Label, TextBox, Button, ToolBar, StatusBar и др.) са наследници на класа Control. Общото за всички тях е, че имат графичен образ и се управляват чрез съобщения.

Контролите, които могат да се скролират (например панелите) са наслед­ници на ScrollableControl. Контролите, които съдържат други контроли и се грижат за управление на фокуса (например формите и диалозите), наследяват ContainerControl.

Класът Control

Класът System.Windows.Forms.Control заема много централна роля в библиотеката Windows Forms. Той е базов клас, основа за всички графич­ни контроли, и определя единна рамка за контролите – програмен модел, по който да се разработват и изпълняват. В него са дефинирани общите за всички контроли свойства и събития.

Свойства на класа Control

Нека сега разгледаме по-важните свойства на класа Control:

-        Anchor, Dock – задават по какъв начин контролата се "закотвя" за контейнера си. Тези свойства са много полезни, ако искаме да упра­вляваме размерите и позицията на контролата при промяна на раз­мерите на контейнера, в който е поставена. Например чрез свойст­вото Anchor можем да закотвим дадена контрола на определено разстояние от долния десен ъгъл на формата, в която стои, и при преоразмеряване това разстояние ще се запазва и контролата ще се движи заедно с движението на долния десен ъгъл на контейнера, в който е поставена.

-        Bounds – задава размера (ширина и височина) и позицията на горния ляв ъгъл на контролата в рамките на нейния контейнер. Ако контро­лата е форма, позицията се задава спрямо горния ляв ъгъл на екра­на. Ако контролата е елемент от форма (например бутон), позицията се отчита спрямо горния ляв ъгъл на формата (или контейнер-контролата), в която е оставена. Размерът включва цялото графично пространство на контролата. Например, ако контролата е форма, се включва и нейната рамка.

-        BackColor – задава цвета на фона. Цветовете са инстанции на струк­турата System.Drawing.Color, която дефинира множество стандарт­ни цветове и позволява потребителски дефинирани цветове, състоящи се от 4 на брой 8-битови компонента (яркост, червено, зелено и синьо).

-        ContextMenu – задава контекстно меню (popup menu) за контролата. Контекстното меню обикновено се появява при натискане на десния бутон на мишката върху контролата.

-        Controls – съдържа колекция от вложените в контролата други контроли (ако има такива). Например формите (инстанции на класа Form) съдържат в колекцията си Controls контролите, които са разположени в тях. По принцип всички Windows Forms контроли имат колекция Controls и могат да съхраняват в нея други контроли, но за някои от тях не е коректно това да се прави. Например не е коректно в бутон да поставяме друг бутон или текстово поле. Ако го направим, се появяват неприятни аномалии.

-        CanFocus – връща дали контролата може да получава фокуса. Почти всички видове контроли могат да бъдат фокусирани, стига да не са забранени (Enabled=false).

-        Enabled – позволява забраняване на контролата. Когато една кон­трола бъде забранена (Enabled=false), тя остава видима, но става неактивна. Обикновено забранените контроли се изобразяват с из­бледнял цвят, за да се различават от останалите. Забранените кон­троли не могат да получават фокуса. В частност забранен бутон не може да бъде натиснат, в забранено текстово поле не може да се пише и т.н. Ако забраним контейнер-контрола, която съдържа в себе си други контроли, всички тези контроли стават забранени.

-        Font – задава шрифта, с който се изписва текстът в контролата (ако контролата по някакъв начин визуализира текст). При текстови полета това е шрифтът на текста в полето. При бутон това е шрифтът на текста в бутона. При етикет това е шрифтът на текста на етикета. Ако се зададе свойството Font за формата, всички контроли, които не дефинират изрично Font, го наследяват от формата. Шрифтът, с който е изобразено заглавието на формите, не може да се променя от Windows Forms. Той се настройва от графичната среда на опера­ционната система (от контролния панел при Windows).

Шрифтовете имат следните характеристики: наименование на шрифт (например Arial) или фамилия шрифтове (например Monospace, SansSerif или Serif), стил (например Bold, Italic, ...), размер (например 12 pt или 10 px) и кодова таблица (Cyrillic, Western, Greek, ...). Кодовата таблица е необходима рядко – само за старите шрифтове, които не поддържат Unicode.

-        ForeColor – задава цвета на контролата.

-        Location – съдържа позицията на контрола в нейния контейнер (координатите на горния й ляв ъгъл). За форми това е позицията на екрана, а за други контроли това е позицията във формата или контейнер-контролата.

-        Parent – задава контейнер-контролата, в която се намира текущата контрола. Може и да няма такава (стойност null). Формите най-често имат стойност null за свойството Parent.

-        Size – съдържа размерите на контролата (ширина и височина).

-        TabIndex – определя реда при навигация с [Tab] и [Shift+Tab].

-        TabStop – задава дали контролата трябва да се фокусира при нави­гация с [Tab] и [Shift+Tab]. Ако се зададе TabStop=false, фокусът не спира в контролата при преминаване към следващата контрола (контролата се прескача).

-        Text – задава текст, свързан с контролата. При етикет това е тек­стът, изобразен в етикета. При бутон това е текстът, изобразен в бутона. При текстово поле това е текстът, въведен в полето. При форма това е заглавието на формата. Текстът е в Unicode и това позволява да се използват свободно букви и знаци на латиница, кирилица, гръцки, арабски и други азбуки, стига избраният шрифт да съдържа съответните знаци.

-        Visible – задава видимост на контролата. Ако за дадена контрола се зададе Visible=false, тя се скрива (изчезва, все едно не съще­ствува). Скрита контрола може да се покаже отново, като й се зададе Visible=true.

Методи на класа Control

Публичните методи на класа Control се наследяват и са достъпни във всички Windows Forms контроли. По-важните от тях са:

-        Focus() – фокусира контролата (ако е възможно).

-        Hide(), Show() – скрива/показва контролата (ефектът е като да зададем Visible=false / Visible=true).

Събития на класа Control

Знаем колко са важни събитията за Windows Forms контролите. Благо­дарение на тях програмистът може да пише код, който се задейства при различни промени в състоянието на контролите. Ще разгледаме по-важ­ните събития на класа Control:

-        Click – настъпва при щракване с мишката върху контролата. При бутон това събитие се извиква при натискане на бутона. При форма Click се извиква при щракване с левия бутон на мишката върху формата, ако в съответната позиция няма друга контрола. Събитието не подава допълнителна информация в аргументите си.

-        Enter, Leave – настъпват съответно при активиране и деактивиране на дадена контрола, т.е. когато контролата получи и загуби фокуса. При форми тези събития не се извикват.

-        KeyDown, KeyUp – настъпват при натискане и отпускане на произ­волен клавиш (включително специалните клавиши като [F1], [Alt], [Caps Lock], [Start] и др.). Събитието подава в аргументите си инстанция на класа KeyEventArgs, която съдържа информация за натиснатия клавиш – име на клавиша (инстанция на изброения тип System.Windows.Forms.Keys) и информация за състоянието на кла­вишите [Shift], [Alt] и [Ctrl].

-        KeyPress – настъпва при натискане на неспециален клавиш или комбинация от клавиши. Това събитие се активира само ако натис­на­тата клавишна комбинация се интерпретира като символ. Напри­мер натискането на клавиша [Alt] не води до получаване на символ и не задейства това събитие, докато натискането на клавиша [V] генерира някакъв символ в зависимост от текущия език. Събитието подава в аргументите си инстанция на KeyPressEventArgs класа, която съдържа символа, генериран в резултат от натискането на клавиша.

-        MouseDown, MouseMove, MouseUp, MouseWheel – настъпват при събития от мишката, извършени върху контролата – натискане на бутон, движение на показалеца на мишката или преместване на колелото. Събитията подават в аргументите си инстанция на MouseEventArgs класа, която съдържа информация за състоянието на бутоните и колелото на мишката и за координатите на показалеца (изчислени спрямо горния ляв ъгъл на контролата).

-        MouseEnter, MouseLeave, MouseHover – настъпват при навлизане, излизане и преместване на позицията на показалеца на мишката в рамките на контролата.

-        Move – настъпва при преместване на контролата. Преместването може да се предизвика от потребителя (например преместване на форма) или програмно (чрез промяна на свойството Location).

-        Paint – настъпва при пречертаване на контролата (при обработката на съобщението WM_PAINT). В това събитие контролата трябва да извърши пречертаването на графичния си образ. Събитието получа­ва в аргументите си инстанция на PaintEventArgs, която съдържа Graphics обекта, върху който трябва да се извърши чертането.

-        Resize – настъпва при промяна на размера на контролата. Може да се предизвика както от потребителя (при преоразмеряване на форма), така и програмно (при промяна на свойството Size).

-        TextChanged – настъпва при промяна на свойството Text на контролата.

-        Validating – използва се за валидация на данните, въведени в контролата. Валидацията на данни ще бъде дискутирана по-късно в настоящата тема.

Класът ScrollableControl

Класът ScrollableControl е наследник на класа Control и добавя към него функционалност за скролиране. Ето по-важните му свойства:

-        AutoScroll – задава дали при нужда контролата ще получи автома­тично скролиращи ленти.

-        HScroll, VScroll – задават дали контролата да има хоризонтална и вертикална скролираща лента.

Класът ContainerControl

Класът ContainerControl осигурява функционалност за управление на фокуса. Свойството му ActiveControl съдържа във всеки един момент кон­тролата, която е на фокус.

Форми, прозорци и диалози

Формите и диалозите в Windows Forms са прозорци, които съдържат контроли. Те могат да бъдат различни видове: да имат или нямат рамка, да са модални или не, да са разтегливи или не, да са над всички други прозорци или не и т.н.

Класът System.Windows.Forms.Form

Класът System.Windows.Forms.Form е базов клас за всички форми в Windows Forms GUI приложенията. Той представлява графична форма - прозорец или диалогова кутия, която съдържа в себе си контроли и управлява навигацията между тях.

Повечето прозорци имат рамка и специални бутони за затваряне, преместване и други стандартни операции. Външният вид на прозорците и стандартните контроли по тяхната рамка зависят от настройките на графичната среда на операционната система. Програмистът има само частичен контрол над външния вид на прозорците.

Класът Form е наследник на класовете Control, ScrollableControl и ContainerControl и наследява от тях цялата им функционалност, всич­ките им свойства, събития и методи.

По-важни свойства на класа Form

Всички прозорци и диалози в Windows Forms наследяват класа Form и придобиват от него следните свойства:

-        FormBorderStyle – указва типа на рамката на формата. По-често използваните типове рамка са следните:

o      Sizable – стандартна разширяема рамка. Потребителят може да променя размерите на такива рамки.

o      FixedDialog – диалогова рамка с фиксирани размери. Такива рамки не могат да се преоразмеряват от потребителите.

o      None – липса на рамка. Цялото пространство на формата се използва за нейното съдържание.

o      FixedToolWindow – кутия с инструменти с фиксиран размер. Рамката не може да се преоразмерява от потребителите и е малко по-тясна от стандартната. Прозорци с такива рамки не се виждат в лентата на задачите (taskbar) на Windows Explorer и при натискане на [Alt+Tab].

-        Controls – съдържа списък с контролите, разположени във формата. От реда на контролите в този списък зависи редът, в който те се чертаят на екрана (Z-order) и редът, в който се преминава от една контрола към друга при навигация (tab order). Редът на преместване на фокуса може да се настройва и допълнително от свойствата TabStop и TabIndex.

-        Text – заглавие на прозореца. Използва се Unicode, т.е. можем да използваме, кирилица, латиница, гръцки и други азбуки от Unicode стандарта.

-        Size – размери на прозореца (ширина и височина). Включва цялото пространство, заемано от формата (рамката + вътрешността).

-        ClientSize – размери на вътрешността на формата (без рамката й).

-        AcceptButton – бутон по подразбиране. Този бутон се натиска авто­матично, когато потребителят натисне клавиша [Enter], независимо от това в коя контрола от формата е фокусът в този момент. Целта е да се улесни потребителя при попълването на форми с информация.

-        ActiveControl – съдържа контролата, която държи фокуса. При промяна на това свойство се променя текущата фокусирана контро­ла.

-        ControlBox – задава дали формата трябва да съдържа стандартните контроли за затваряне, минимизация и т. н.

-        Icon – задава икона на прозореца.

-        KeyPreview – ако се зададе true, позволява формата да обработва събитията от клавиатурата, преди да ги предаде на фокусираната контрола. Ако стойността е false, всяко събитие от клавиатурата се обработва само от контролата, която е на фокус.

-        MinimumSize, MaximumSize – задава ограничения за размера на формата – максимална и минимална ширина и височина. При опит за преоразмеряване не се позволява потребителят да задава размер, който не е в тези граници.

-        Modal – връща дали формата е модална. Когато една форма е модал­на, докато тя е активна, потребителят не може да работи с други форми от същото приложение. Всеки опит за преминаване в друга форма не успява, докато потребителят не затвори модалната форма. Ако дадено приложение покаже едновременно няколко форми, които не са модални, потребителят ще може да преминава свободно между тях, без да ги затваря. Свойството Modal е само за четене. Модал­ността може да се задава първоначално, но не може да се променя, след като формата е вече показана.

-        Opacity – задава прозрачност на формата (число от 0.00 до 1.00). Възможно е да не се поддържа или да работи много бавно при някои по-стари видеоадаптери.

-        MdiChildren – в MDI режим извлича / задава подчинените форми на текущата форма. MDI (Multiple-Document Interface) е режим, при който дадена форма на приложението (обикновено главната форма) може да съдържа в себе си други форми, които са разположени в нейното работно пространство (като обикновени контроли).

-        MdiParent – в MDI режим извлича / задава формата, която е собст­веник на текущата форма. Важи само за подчинени (child) форми.

-        TopMost – задава дали формата стои над всички други прозорци (always on top). В такъв режим, дори ако формата не е активна, тя остава видима и стои над всички останали форми.

-        WindowState – извлича състоянието на формата. Формата във всеки един момент е в някое от състоянията на изброения тип FormWindowState – нормално, минимизирано или максимизирано. По подразбиране формите са в нормално състояние – имат нормалния си размер. В максимизирано състояние формите временно променят размера си и заемат целия екран без лентата за задачи (task bar) на Windows Explorer. В минимизирано състояние формите са скрити и се виждат само в лентата за задачи (task bar).

По-важни методи на класа Form

Прозорците и диалозите в Windows Forms наследяват от класа Form следните базови методи:

-        Show() – показва формата и я прави активна (фокусира я). Формата се показва в немодален режим. Извикването на този метод е еквива­лентно на присвояването Visible=true. Изпълнението на този метод приключва веднага.

-        ShowDialog() – показва формата в модален режим и след като тя бъде затворена, връща като резултат стойност от тип DialogResult. Тази стойност съдържа информация за причината за затваряне на формата. Изпълнението на метода ShowDialog() приключва едва след затваряне на формата, т.е. методът е блокиращ. По-нататък в настоящата тема ще обърнем специално внимание на извикването на модални форми и получаването на стойностите от контролите в тях.

-        Close() – затваря формата. Когато една форма бъде затворена, тя изчезва и се освобождават използваните от нея ресурси. След като една форма бъде затворена, тя не може да бъде повече показвана. За временно скриване на форма трябва да се използва методът Hide(), а не Close().

-        LayoutMdi(…) – в MDI режим този метод пренарежда дъщерните (child) форми, съдържащи се в текущата форма. Начинът на прена­реждане се задава от програмиста. Поддържат се няколко вида пренареждане - каскадно, хоризонтално, вертикално и др.

По-важни събития на класа Form

Всички прозорци и диалози в Windows Forms поддържат съвкупност от стандартни събития, които наследяват от класа Form:

-        Activated / Deactivate – извикват се при активиране / деакти­виране на формата (когато формата получи / загуби фокуса).

-        Closing – извиква се при опит за затваряне на формата (например, когато потребителят натисне стандартния бутон за затваряне). Реа­лизацията може да предизвиква отказване на затварянето. Събити­ето подава в аргументите си инстанция на класа CancelEventArgs, която има булево свойство Cancel, чрез което може да се откаже затварянето.

-        Load – извиква се еднократно преди първото показване на формата. Може се ползва за инициализиране на състоянието на контролите.

Основни контроли в Windows Forms

Да разгледаме най-често използваните контроли в Windows Forms: TextBox, Label и Button.

TextBox

TextBox контролата е поле за въвеждане на текст. Може да бъде едно­редово или многоредово. По-важните свойства на TextBox са:

-        Multiline – задава дали контролата представлява само един ред или допуска въвеждането на няколко реда текст.

-        Text – съдържа въведения в контролата текст. Когато свойството Multiline е true, за достъп до въведения текст може да се използва и свойството Lines.

-        Lines – масив от символни низове, съдържащ въведения текст. Всеки елемент от масива съдържа един от редовете на текста.

Label

Контролата Label се използва за изобразяване на текст във формата. Свойството й Text съдържа текста, който се изобразява.

Button

Контролата Button представлява бутон, който може да бъде натискан. По-важни нейни свойства и събития са:

-        Click – активира се при натискане на бутона.

-        Text – задава текста, изобразяван върху бутона.

Поставяне на контроли във формата

Поставянето на контроли във форма става чрез добавянето им към колекцията от контроли на формата. Това може да се извърши чрез метода Controls.Add(…):

Form form = new Form();

Button button = new Button();

button.Text = "Close";

form.Controls.Add(button);

Редът на контролите (т. нар. Z-order, който споменахме по-рано в тази тема) се определя от реда на поставянето им – последната контрола е най-отгоре. Когато използваме Windows Forms дизайнерът на Visual Studio .NET, той се грижи за правилното поставяне на контролите.

Управление на събитията

Прихващането на събитие става чрез добавянето на обработчик за него. За целта създаваме метод, който ще обработва събитието, и след това се абонираме за него. Ето пример:

Form form = new Form();

Button button = new Button();

button.Click += new EventHandler(this.button_Click);

...

private void button_Click(object sender, EventArgs e)

{

  // Handle the "click" event

}

Windows Forms дизайнерът на Visual Studio .NET улеснява прихващането на събития, като генерира автоматично обработчиците при избор на събитие от страницата "Events" на прозореца "Properties".

В Windows Forms има няколко типа събития:

-        EventHandler – извършва проста нотификация, без да подава допълни­телни данни за възникналото събитие.

-        KeyEventHandler – събития от клавиатурата. Подава се информация кой е натиснатият клавиш, както и информация за състоянието на клавишите [Ctrl], [Shift] и [Alt].

-        MouseEventHandler – събития от мишката. Подава се информация за позицията на мишката и състоянието на нейните бутони.

-        CancelEventHandler – събития, които могат да откажат започнатото действие. Примерно, ако прихващаме събитието Closing на дадена форма, което е от тип CancelEventHandler, и потребителят се опита да затвори формата, можем да откажем затварянето, ако данните не са запазени.

Прост калкулатор – пример

Настоящият пример илюстрира използването на Windows Forms за създа­ва­нето на просто приложение – калкулатор за събиране на цели числа:

using System;

using System.Drawing;

using System.Windows.Forms;

 

public class CalculatorForm : Form

{

  private TextBox TextBoxNumber1;

  private TextBox TextBoxNumber2;

  private TextBox TextBoxSum;

  private Button ButtonCalc;

  private Label LabelPlus;

  private Label LabelEquals;

 

  public CalculatorForm()

  {

     TextBoxNumber1 = new TextBox();

     TextBoxNumber1.Bounds = new Rectangle(

       new Point(16, 16), new Size(72, 20));

     TextBoxNumber1.MaxLength = 10;

 

     LabelPlus = new Label();

     LabelPlus.AutoSize = true;

     LabelPlus.Location = new Point(94, 19);

     LabelPlus.Text = "+";

 

     TextBoxNumber2 = new TextBox();

     TextBoxNumber2.Bounds = new Rectangle(

       new Point(112, 16), new Size(72, 20));

     TextBoxNumber2.MaxLength = 10;

 

     LabelEquals = new Label();

     LabelEquals.AutoSize = true;

     LabelEquals.Location = new Point(191, 18);

     LabelEquals.Text = "=";

 

     TextBoxSum = new TextBox();

     TextBoxSum.Bounds = new Rectangle(

       new Point(208, 16), new Size(72, 20));

     TextBoxSum.ReadOnly = true;

 

     ButtonCalc = new Button();

     ButtonCalc.Bounds = new Rectangle(

       new Point(16, 48), new Size(264, 23));

     ButtonCalc.Text = "Calculate sum";

     ButtonCalc.Click += new EventHandler(

       this.ButtonCalc_Click);

 

     this.AcceptButton = ButtonCalc;

     this.ClientSize = new Size(298, 87);

     this.Controls.Add(TextBoxNumber1);

     this.Controls.Add(LabelPlus);

     this.Controls.Add(TextBoxNumber2);

     this.Controls.Add(LabelEquals);

     this.Controls.Add(TextBoxSum);

     this.Controls.Add(ButtonCalc);

     this.FormBorderStyle = FormBorderStyle.FixedDialog;

     this.MaximizeBox = false;

     this.MinimizeBox = false;

     this.Text = "Calculator";

  }

 

  private void ButtonCalc_Click(object aSender, EventArgs aArgs)

  {

     try

     {

       int value1 = Int32.Parse(TextBoxNumber1.Text);

       int value2 = Int32.Parse(TextBoxNumber2.Text);

       int sum = value1 + value2;

       TextBoxSum.Text = sum.ToString();

     }

     catch (FormatException)

     {

       TextBoxSum.Text = "Invalid!";

     }

    

     TextBoxNumber1.SelectAll();

     TextBoxNumber2.SelectAll();

 

     TextBoxNumber1.Focus();

  }

 

  static void Main()

  {

     CalculatorForm CalcForm = new CalculatorForm();

     Application.Run(CalcForm);

  }

}

Как да компилираме и стартираме примера?

За да компилираме примера, можем да ползваме конзолния компилатор на .NET Framework за езика C#:

csc CalculatorForm.cs

Можем да извършим компилацията и от VS.NET, но за целта трябва да създадем нов Windows Application проект и да копираме кода в него.

Ето как изглежда примерното приложение в действие:

Как работи примерът?

В примера сме дефинирали класа CalculatorForm, който наследява класа System.Windows.Forms.Form. Този клас представлява главната форма на нашето приложение.

В класа дефинираме необходимите ни контроли – три TextBox контроли (две за въвеждане на числа и една за извеждане на сумата им), две Label контроли и един бутон, при натискането на който ще се изчислява резул­татът от събирането на числата.

В конструктора на формата инициализираме контролите и ги добавяме в нея. За целта им задаваме размери, местоположение и някои други свойства. За текстовите полета, в които потребителят ще въвежда числа­та, които ще събираме, задаваме максималната им дължина в брой симво­ли. За Label контролите задаваме текста, който ще визуализират. За бутона задаваме заглавие. Накрая задаваме начина, по който ще изглеж­да нашата форма.

В метода CalcButton_Click(…) обработваме събитието Click на буто­на за изчисляване на сумата. В него парсваме съдържанието на двете текстови полета, сумираме числовите стойности, получени от тях, и записваме сумата в третото текстово поле. При грешка задаваме невалиден резултат.

Windows Forms редакторът на VS.NET

Създаването на форми, добавянето на контроли, настройката на разме­рите и местоположението на контролите и други такива операции, можем да извършваме, пишейки директно кода за нашето приложение, както в предходния пример. Разработка­та на приложения и създаването на потре­бителски интерфейс по този начин, обаче, е трудоемък и времеотнемащ процес.

Windows Forms редакторът на VS.NET ни дава възможност да правим всички тези неща визуално, ускорявайки процеса на разработка. Той улеснява значително извършването на следните операции:

-        създаване на форми

-        добавяне на контроли във формите

-        добавяне на неграфични компоненти във формите

-        настройка на свойствата на форми, компоненти и контроли

-        добавяне на събития за форми, компоненти и контроли

Създаване на форма

Създаването на форма във VS.NET става, като от менюто File изберем Add New Item. В появилия се диалогов прозорец избираме Windows Form, в полето за име въвеждаме името на формата и натискаме бутона Open. Нашата нова форма се отваря в редактора на VS.NET:

Добавяне на контрола

Добавянето на контрола става, като отворим формата, щракнем върху контролата в Toolbox, след това щракнем върху формата там, където искаме да е горният ляв ъгъл на контролата, и изтеглим мишката до там, където искаме да е долният й десен ъгъл. Контролата се добавя във формата с определеното местоположение и размери:

Всички контроли имат подразбиращ се размер. Ако желаем да добавим контрола с подразби­ращия се размер, можем просто да я изтеглим от Toolbox и да я пуснем във формата (drag and drop).

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

За да добавим неграфична компонента, отваряме формата, щракваме върху компонентата в Toolbox и я изтегляме върху формата. Тъй като неграфичните компоненти нямат потребителски интерфейс, те не се показват върху формата, а се изобразяват в специална област под нея:

Настройка на свойства

Настройката на свойства се извършва в прозореца Properties на редактора. Ако прозорецът не е видим, можем да го покажем, като изберем View | Properties Window от менюто, натиснем [F4] или изберем Properties от контекст­но­то меню, появяващо се при щракване с десния бутон на мишката върху контролата. От падащия списък, намиращ се най-отгоре в прозореца, избираме обекта, чиито свойства ще настройваме. След това избираме свойството, което ще променяме, и му задаваме стойност. В зависимост от свойството ще зададем текст, числова стойност или ще изберем стойността от списък. Ето как изглежда прозорецът Properties на VS.NET:

Добавяне на обработчици на събития

Добавянето на обработчици на събития също става от прозореца Properties на VS.NET:

За целта от падащия списък, намиращ се най-отгоре в прозореца, избираме обекта, чиито свойства ще настройваме, и натискаме бутона Events, намиращ се под падащия списък. Появяват се събитията на обекта. От падащия списък срещу събитието, за което искаме да добавим обработчик, избираме метода, който ще обработва събитието. Ако ще дефинираме нов метод за обработка на събитието, изписваме неговото име в полето. Друга възможност е да щракнем 2 пъти с мишката и VS.NET ще избере име по подразбиране (името на контролата + "_" + името на събитието, примерно OkButton_Click). При създаване на обработчик за събитие Windows Forms редакторът добавя или намира метода и отваря редактора за код, позициониран точно върху него.

Създаване на калкулатор с Windows Forms редактора на VS.NET – пример

С настоящия пример ще илюстрираме използването на Windows Forms редактора на VS.NET за създаването на просто приложение – калкулатор, който събира цели числа. Функционалността на калкулатора ще е същата като на калкулатора от предишния пример, но този път ще използваме Windows Forms редактора, който ще генерира по-голямата част от кода на приложението.

Ето стъпките за създаването на нашия калкулатор:

1.   Стартираме VS.NET и създаваме нов Windows Forms проект.

2.   Задаваме на главната форма име Calculator и заглавие "Simple Calculator". Променяме и името на файла от Form1.cs на Calculator.cs.

3.   Вземаме от Toolbox на VS.NET три TextBox, две Label и една Button контроли и ги поставяме в главната форма. Задаваме подходящи имена на поставените компоненти. Препоръчително е името на една контрола да съдържа нейното предназначение и тип (или префикс, указващ типа). В нашия случай подходящи имена са: TextBoxNumber1, TextBoxNumber2, TextBoxSum, LabelPlus, LabelEquals и ButtonCalcSum.

4.   Задаваме празен низ в свойството Text на текстовите полета. За полето TextBoxSum задаваме ReadOnly да е true. На свойството Text на ButtonCalcSum задаваме стойност "Calculate sum". На свойствата Text на LabelPlus и LabelEquals задаваме съответно стойности "+" и "=". Ето как изглежда формата на нашия калку­латор в този момент:

5.   Остава да дефинираме събитието за натискане на бутона. С двойно щракване върху бутона VS.NET ни дава възможност да напишем кода за обработка на събитието му Click:

private void ButtonCalcSum_Click(object sender,

  System.EventArgs e)

{

  try

  {

     int value1 = Int32.Parse(TextBoxNumber1.Text);

     int value2 = Int32.Parse(TextBoxNumber2.Text);

     int sum = value1 + value2;

     TextBoxSum.Text = sum.ToString();

  }

  catch (FormatException)

  {

     TextBoxSum.Text = "Invalid!";

  }

 

  TextBoxNumber1.SelectAll();

  TextBoxNumber2.SelectAll();

 

  TextBoxNumber1.Focus();

}

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

6.   Приложението вече е готово и можем да го стартираме и тестваме. Ето как изглежда нашият калкулатор:

Диалогови кутии

При разработката на Windows Forms приложения често пъти се налага да извеждаме диалогови кутии с някакви съобщения или с някакъв въпрос. Нека разгледаме стандартните средства за такива ситуации.

Стандартни диалогови кутии

Класът MessageBox ни позволява да извеждаме стандартни диалогови кутии, съдържащи текст, бутони и икони:

-        съобщения към потребителя

-        въпросителни диалози

Показването на диалогова кутия се извършва чрез извикване на статич­ния метод Show(…) на класа MessageBox. Следният код, например, ще покаже диалогова кутия със заглавие "Предупреждение" и текст "Няма връзка с интернет":

MessageBox.Show("Няма връзка с Интернет.", "Предупреждение");

Ето как изглежда диалоговата кутия:

Нека разгледаме още един пример за стандартна диалогова кутия с малко повече функционалност:

bool confirmed =

  MessageBox.Show("Наистина ли ще изтриете това?",

  "Въпрос", MessageBoxButtons.YesNo,

  MessageBoxIcon.Question) == DialogResult.Yes;

Този код ще покаже диалогова кутия със заглавие "Въпрос" и текст "Наистина ли ще изтриете това?". Преди текста ще има икона с въпросителен знак в нея, а под него – бутони Yes и No. Ако потребителят натисне Yes, променливата confirmed ще има стойност true, в противен случай ще има стойност false. Ето как изглежда диалоговата кутия от примера:

Повече информация за класа MessageBox може да се намери в MSDN.

Извикване на диалогови кутии

Освен стандартните диалогови кутии можем да използваме и потреби­телски дефинирани диалогови кутии. Те представляват обикновени форми и се извикват модално по следния начин:

DialogResult result = dialog.ShowDialog();

Методът ShowDialog() показва формата като модална диалогова кутия. Типът DialogResult съдържа резултата (OK, Yes, No, Cancel и др.) от извикването на диалога. Задаването на DialogResult може да става авто­матично, чрез свойството DialogResult на бутоните, или ръчно – преди затварянето на диалога чрез свойството му DialogResult.

Ако извиквате форма модално, след това задължително трябва да й извиквате Dispose() метода, за да освободите ресурсите, които тя е използвала. В противен случай те ще се освободят едва когато се активира Garbage Collector и ще се използват ненужно дълго.

DialogResult и предаване на данни между диалози – пример

С настоящия пример ще илюстрираме използването на диалози в Windows Forms, ще покажем как диалозите могат да се извикват един друг и как могат да си предават данни.

В примера ще създадем един диалог, съдържащ текстово поле за въвеж­дане на име и два бутона – OK и Cancel. Този диалог ще се показва при натискане на бутон от главната форма. Ако потребителят въведе име и натисне OK, ще се показва диалог, съдържащ въведеното име, а ако потребителят затвори диалога, натискайки Cancel, ще се появи диалог, указващ, че е натиснат Cancel.

Ето и стъпките за изграждане на нашия пример:

1.   Стартираме VS.NET и създаваме нов Windows Forms проект. В редактора се появява главната форма на приложението. На нея ще се спрем след малко.

2.   Създаваме нова форма (File | Add New Item … | Windows Form). Сменяме името й на DialogForm, а името на нейния файл – на DialogForm.cs. Задаваме на свойствата й MinimizeBox и MaximizeBox стойности false, а на свойството FormBorderStyle стойност FixedDialog. Тази форма ще служи за въвеждане на името на потребителя.

3.   Вземаме от Toolbox на VS.NET една Label, една TextBox и две Button контроли и ги подреждаме върху формата. Задаваме им подходящи имена. В нашия случай подходящи са имената: LabelYourName, TextBoxName, ButtonOK и ButtonCancel.

4.   Задаваме свойството Text на LabelYourName да е "Enter your name:", на ButtonOk да е "OK", на ButtonCancel да е "Cancel", а на TextBoxName – празен низ.

5.   Задаваме на свойството DialogResult на бутона ButtonOk стойност OK. По този начин при натискането му формата ще се затвори и ще бъде върнат резултат DialogResult.OK. Аналогично на свойството DialogResult на бутона ButtonCancel задаваме стойност Cancel. Ето как изгле