В този урок за програмиране на C # ще се съсредоточа върху усъвършенстваните контроли като ComboBoxes, Grids и ListViews и ще ви покажа начина, по който най-вероятно ще ги използвате. Не пипам данни и обвързване до по-късен урок. Нека започнем с един прост контрол, ComboBox.
В основата на Combo е колекция от елементи и най-простият начин за попълване на това е да пуснете комбо на екрана, изберете свойства (ако не можете да видите прозорците на свойствата, щракнете върху Преглед в горното меню и след това прозорец със свойства), намерете елементи и щракнете върху елипсите бутон. След това можете да въведете низовете, да съставите програмата и да дръпнете комбинацията надолу, за да видите избор.
Сега спрете програмата и добавете още няколко числа: четири, пет.. до десет. Когато го стартирате, ще видите само 8, защото това е стойността по подразбиране на MaxDropDownItems. Чувствайте се свободни да го зададете на 20 или 3 и след това да го стартирате, за да видите какво прави.
Досадно е, че когато се отвори, пише comboBox1 и можете да го редактирате. Това не е, което искаме. Намерете свойството DropDownStyle и променете DropDown на DropDownList. (Това е комбо!). Сега няма текст и не може да се редактира. Можете да изберете едно от номерата, но то винаги се отваря празно. Как да изберем номер, с който да започнем? Ами това не е свойство, което можете да зададете по време на проектиране, но добавянето на тази линия ще направи това.
Добавете този ред в конструктора Form1 (). Трябва да прегледате кода за формата (в Explorer Explorer, щракнете с десния бутон върху From1.cs и щракнете върху View Code. Намери InitializeComponent (); и добавете този ред веднага след това.
Ако зададете свойството DropDownStyle за комбото на Simple и стартирайте програмата, няма да получите нищо. Той няма да избере или щракне или отговори. Защо? Защото по време на проектиране трябва да хванете дръжката за по-ниска опъване и да направите целия контрол по-висок.
В пример 2 преименувах ComboBox на combo, промених combo DropDownStyle обратно на DropDown, за да може да бъде редактиран и добавих бутон Add, наречен btnAdd. Кликнах два пъти върху бутона за добавяне, за да създам събитие за обработка на събития btnAdd_Click () и добавих този ред за събитие.
Сега, когато стартирате програмата, въведете нов номер, кажете Eleven и щракнете върху добавяне. Обработващият събитията взема текста, който сте въвели (в комбинация). Text) и го добавя към колекцията от елементи на Combo. Кликнете върху Combo и вече имаме нов запис Eleven. Така добавяте нов низ към комбо. За да премахнете такъв е малко по-сложно, тъй като трябва да намерите индекса на низ, който искате да премахнете, след което го премахнете. Методът RemoveAt, показан по-долу, е метод за събиране, за да направите това. просто трябва да посочите кой елемент в параметъра Removeindex.
ще премахне низа в позиция RemoveIndex. Ако в комбинацията има n елемента, валидните стойности са от 0 до n-1. За 10 артикула стойности 0..9.
Ако това не намери текста, той се връща -1, в противен случай връща 0 базиран индекс на низа в комбинирания списък. Има и претоварен метод на FindStringExact, който ви позволява да посочите откъде да започнете търсенето, така че можете да пропуснете първия и т.н., ако имате дубликати. Това може да бъде полезно за премахване на дубликати в списък.
Кликването на btnAddMany_Click () изчиства текста от комбо, след това изчиства съдържанието на колекцията от елементи на комбо, след което извиква комбо. AddRange (за добавяне на низовете от масива от стойности. След това прави настройката на SelectedIndex на комбото на 0. Това показва първия елемент в комбинацията. Ако правите добавяне или изтриване на елементи в ComboBox, тогава е най-добре да следите кой елемент е избран. Задаването на SelectedIndex на -1 крие избраните елементи.
Бутонът Add Lots изчиства списъка и добавя 10 000 числа. Добавих комбо. StartUpdate () и комбо, EndUpdate () се обажда около контура, за да предотврати каквото и да е трептене от Windows, опитващо се да актуализира контрола. На моя тригодишен компютър е нужна малко повече от секунда, за да добавите 100 000 числа в комбинацията.
Това е удобно управление за показване на таблични данни без сложността на мрежа. Можете да показвате елементи като големи или малки икони, като списък с икони във вертикален списък или най-полезно като списък с елементи и поддетамини в мрежа и това ще направим тук.
След като пуснете ListView във формуляр, щракнете върху свойството на колоните и добавете 4 колони. Това ще бъдат TownName, X, Y и Pop. Задайте текста за всеки ColumnHeader. Ако не можете да видите заглавията в ListView (след като добавите всички 4), задайте свойството View List View на Details. Ако преглеждате кода за този пример, след това преминете надолу до мястото, където пише кодът на Windows Form Designer и разширете региона, който виждате кода, който създава ListView. Полезно е да видите как работи системата и можете да копирате този код и да го използвате сами.
Можете да зададете ширината за всяка колона ръчно, като преместите курсора върху заглавката и го плъзнете. Или можете да го направите в кода, видим, след като разширите региона на дизайнера на формата. Трябва да видите код като този:
За колоната от популации Промените в кода се отразяват в дизайнера и обратно. Имайте предвид, че дори да зададете свойството Locked на true, това се отразява само на дизайнера и по време на изпълнение можете да преоразмерите колоните.
ListViews също се предлагат с редица динамични свойства. Щракнете върху (Dynamic Properties) и маркирайте свойството, което искате. Когато зададете свойството да бъде динамично, той създава XML .config файл и го добавя към Solution Explorer.
Правенето на промени по време на проектиране е едно, но наистина трябва да го направим, когато програмата работи. ListView е съставен от 0 или повече елемента. Всеки елемент (ListViewItem) има текстово свойство и колекция SubItems. Първата колона показва текста на елемента, а следващата колона показва SubItem [0] .text, след това SubItem [1] .text и така нататък.
Добавих бутон за добавяне на ред и поле за редактиране на името на града. Въведете всяко име в полето и щракнете върху Добавяне на ред. Това добавя нов ред към ListView с името на града, поставено в първата колона и следващите три колони (SubItems [0..2]) се попълват с произволни числа (преобразувани в низове), като се добавят тези низове в тях.
Сега задайте свойството ListView Multiselect на false. Искаме само да изберем един елемент наведнъж, но ако искате да премахнете повече в един момент, това е подобно, освен че трябва да прегледате обратно. (Ако завъртите в нормален ред и изтриете елементи, следващите елементи не се синхронизират с избраните индекси).
Менюто с десния бутон не работи все още, тъй като нямаме елементи от менюто, които да се показват в него. Така че щракнете с десния бутон върху PopupMenu (под формата) и ще видите контекстното меню да се появи в горната част на формата, където се появява нормалният редактор на менюто. Щракнете върху него и където пише Type Type Here, напишете Remove Item. Прозорецът на свойствата ще покаже MenuItem, така че го преименувайте, за да mniRemove. Щракнете двукратно върху този елемент от менюто и трябва да получите функцията на кода на обработващия събитие menuItem1_Click. Добавете този код, така че да изглежда така.
Ако изгубите поглед върху Премахване на елемент, просто щракнете върху контрола PopupMenu самостоятелно под формата във формуляра дизайнер. Това ще го върне обратно в полезрението.
Ако обаче го стартирате и не добавите елемент и го изберете, когато щракнете с десния бутон на мишката и получите менюто и щракнете върху Премахване на елемент, той ще даде изключение, защото няма избран елемент. Това е лошо програмиране, така че ето как го поправите. Щракнете двукратно върху изскачащото събитие и добавете този ред код.
A DataGridView е както най-сложният, така и най-полезният компонент, предоставен безплатно с C #. Работи както с източници на данни (т.е. данни от база данни), така и без (т.е. данни, които добавяте програмно). За останалата част от този урок ще покажа използването му без източници на данни, За по-прости нужди на дисплея може да намерите обикновен ListView по-подходящ.
Ако сте използвали по-стар DataGrid контрол, това е само един от тези на стероидите: той ви дава повече вградени типове колони, може да работите с вътрешни, както и външни данни, повече персонализиране на дисплея (и събития) и дава по-голям контрол върху боравенето с клетки със замразяващи редове и колони.
Когато проектирате формуляри с мрежови данни, най-обикновено е да посочвате различни типове колони. Може да имате отметки в една колона, само за четене или за редактиране на текст в друга и номера на курсове. Тези типове колони също обикновено са подравнени по различен начин с числата, които обикновено са подравнени вдясно, така че десетичните знаци да са подредени. На ниво колона можете да изберете от бутон, отметка, ComboBox, изображение, TextBox и връзки. ако те не са достатъчни, можете да оскверните собствените си персонализирани типове.
Най-лесният начин за добавяне на колони е чрез проектиране в IDE. Както видяхме преди това просто пише код за вас и когато сте го направили няколко пъти, може да предпочетете сами да добавите кода. След като направите това няколко пъти, той ви дава представа как да го направите програмно.
Нека започнем с добавяне на някои колони, пуснете DataGridView във формата и щракнете върху малката стрелка в горния десен ъгъл. След това щракнете върху Добавяне на колона. Направете това три пъти. Ще се появи диалогов прозорец Добавяне на колона, в който зададете името на колоната, текстът да се показва в горната част на колоната и ви позволява да изберете типа му. Първата колона е Вашето име и това е TextBox по подразбиране (dataGridViewTextBoxColumn). Задайте и текста на заглавието на вашето име. Направете втората колона Age и използвайте ComboBox. Третата колона е разрешена и е колона за чекбокс.
След като добавите и трите, трябва да видите ред от три колони с комбо в средната (Възраст) и квадратче за отметка в колоната Разрешено. Ако щракнете върху DataGridView, тогава в инспектора за свойства трябва да намерите колони и да кликнете (колекция). Това изскача диалогов прозорец, в който можете да зададете свойства за всяка колона, като индивидуални цветове на клетката, текст подсказка, ширина, минимална ширина и т.н. Ако компилирате и стартирате, ще забележите, че можете да промените ширината на колоните и времето на изпълнение. В инспектора на свойствата за основния DataGridView можете да зададете AllowUser да преоразмеряваColumns на false, за да предотвратите това.
Ще добавим редове към контрола DataGridView в код и ex3.cs във файла с примери има този код. Започвайки с добавяне на поле TextEdit, ComboBox и бутон към формата с DataGridView върху него. Задайте свойството DataGridView AllowUserto AddRows на false. Аз също използвам етикети и наричам combobox cbAges, бутона btnAddRow и TextBox tbName. Добавих също бутон за затваряне на формата и щракнах два пъти върху него, за да генерирам скелет на манипулатор на събитие в btnClose_Click. Добавянето на думата Close () прави това да работи.
По подразбиране свойството за активиране на бутона Add Row е зададено невярно при стартиране. Не искаме да добавяме редове към DataGridView, освен ако има текст както в полето Name TextEdit, така и в ComboBox. Създадох метода CheckAddButton и след това генерирах манипулатор на събитието Leave за полето за редактиране на Name Text, като щракнете двукратно до думата Leave in Properties, когато тя показваше събитията. Полето Properties показва това на снимката по-горе. По подразбиране полето Properties показва свойства, но можете да видите обработващи събития, като щракнете върху бутона на мълния.
Можете вместо това да използвате събитието TextChanged, въпреки че това ще извика CheckAddButton () метод за всяко натискане на клавиш, а не когато управлението е изоставено, т.е. когато друг контрол придобие съсредоточи. В комбинацията за възрасти използвах TextChanged събитието, но избрах манипулатора на събитията tbName_Leave, вместо да кликвам два пъти, за да създам нов манипулатор на събития.
Не всички събития са съвместими, тъй като някои събития осигуряват допълнителни параметри, но ако можете да видите преди това генериран манипулатор, да, можете да го използвате. Това е най-вече въпрос на предпочитания, можете да имате отделен манипулатор на събития за всяка контрола, която сте използване или споделяне на манипулатори на събития (както направих аз), когато имат общ подпис на събитие, т.е. параметрите са един и същ.
Преименувах компонента DataGridView на dGView за краткост и щракнах два пъти върху AddRow, за да генерирам скелет на обработващия събитие. Този код по-долу добавя нов празен ред, получава този индекс на редове (това е RowCount-1, тъй като току-що е добавено и RowCount е 0 базирани) и след това осъществява достъп до този ред чрез неговия индекс и задава стойностите в клетките на този ред за колоните YourName и Възраст.
Когато проектирате формуляр, трябва да помислите по отношение на контейнерите и контролите и кои групи от контроли трябва да се съхраняват заедно. В западните култури така или иначе хората четат от горе вляво до долу вдясно, така че по-лесно да се чете по този начин.
Контейнер е всеки от контролите, който може да съдържа други контроли. Намерените в кутията с инструменти включват панела, FlowLayoutpanel, SplitContainer, TabControl и TableLayoutPanel. Ако не можете да видите кутията с инструменти, използвайте менюто View и ще го намерите. Контейнерите държат контролите заедно и ако преместите или промените размера на контейнера, това ще се отрази на позиционирането на контролите. Просто преместете контролите над контейнера в конструктора на формуляри и той ще разпознае, че контейнерът вече отговаря.
Панел е подобен на GroupBox, но GroupBox не може да превърта, но може да показва надпис и има рамка по подразбиране. Панелите могат да имат рамки, но по подразбиране не. Използвам GroupBoxes, защото изглеждат по-добре и това е важно, защото:
Панелите са удобни и за групиране на контейнери, така че може да имате два или повече GroupBoxes на панел.
Ето един съвет за работа с контейнери. Хвърлете сплит контейнер на формуляр. Щракнете върху левия панел и след това десния. Сега опитайте и премахнете SplitContainer от формата. Трудно е, докато щракнете с десния бутон върху един от панелите и след това щракнете върху Select SplitContainer1. След като всичко е избрано, можете да го изтриете. Друг начин, който се отнася за всички контроли и контейнери, е натиснете клавиша Esc за да изберете родителя.
Контейнерите могат да гнездят и един в друг. Просто плъзнете малка върху горната част на по-голяма и ще видите накратко тънка вертикална линия, която показва, че едната е вътре в другата. Когато плъзнете родителския контейнер, детето се премества с него. Пример 5 показва това. По подразбиране светлокафявият панел не е вътре в контейнера, така че когато щракнете върху бутона за преместване, GroupBox се премества, но панелът не е. Сега плъзнете панела върху GroupBox, така че да е напълно вътре в Groupbox. Когато компилирате и стартирате този път, щракването върху бутона Move се движи и двете заедно.
TableLayoutpanel е интересен контейнер. Това е структура на таблица, организирана като 2D мрежа от клетки, където всяка клетка съдържа само една контрола. Не можете да имате повече от една контрола в клетка. Можете да определите как расте таблицата, когато се добавят повече контроли или дори ако не расте, изглежда моделирана в HTML таблица, защото клетките могат да обхващат колони или редове. Дори поведението на закрепване на контролите за деца в контейнера зависи от настройките на марджин и подплънки. Ще видим повече за котвите на следващата страница.
В пример Ex6.cs, започнах с основна таблица с две колони и посочих чрез диалоговия прозорец Стилове за контрол и редове (изберете контрола и щракнете върху малкото десен сочещ триъгълник, разположен в горния десен ъгъл, за да видите списък със задачи и щракнете върху последната), че лявата колона е 40%, а дясната колона 60% от ширина. Тя ви позволява да посочите ширините на колоните в абсолютно пикселно изражение, в процент или можете просто да я оставите на AutoSize. По-бърз начин да стигнете до този диалогов прозорец е просто да щракнете върху колекцията до колони в прозореца със свойства.
Добавих бутон AddRow и оставих свойството GrowStyle със стойността му по подразбиране AddRows. Когато таблицата се напълни, тя добавя още един ред. Като алтернатива можете да зададете неговите стойности на AddColumns и FixedSize, така че да не може да расте повече. В Ex6, когато щракнете върху бутона Добавяне на контроли, той три пъти извиква метода AddLabel () и AddCheckBox () веднъж. Всеки метод създава екземпляр от контрола и след това извиква tblPanel. Контроли. Добавяне () След добавяне на 2рия контрол, третите контроли причиняват разрастване на таблицата. Картината го показва след натискане на бутона за добавяне на контрола веднъж.
В случай, че се чудите откъде идват стойностите по подразбиране в методите AddCheckbox () и AddLabel (), които наричам, контролът беше първоначално ръчно добавен към таблицата в дизайнера и след това кодът за създаването му и инициализирането му е копиран от това регион. Ще намерите инициализационния код в обаждането на метода InitializeComponent, след като щракнете върху + отляво на Региона по-долу:
Можете да изберете няколко контрола едновременно, като задържите клавиша Shift, когато изберете втория и следващите контроли, дори контролите от различни видове. Прозорецът Properties показва точно тези свойства, общи за двете, така че можете да ги настроите на еднакъв размер, цвят и текстови полета и т.н. Дори едни и същи обработващи събития могат да бъдат назначени на множество контроли.
В зависимост от използването, някои формуляри често ще бъдат оразмерени от потребителя. Нищо не изглежда по-лошо от това да промените размера на формата и да видите контролите да останат в една и съща позиция. Всички контроли имат котви, които ви позволяват да ги "прикрепите" към 4-те ръба, така че контролата да се движи или да се разтяга, когато прикачен ръб се премести. Това води до следното поведение, когато дадена форма е опъната от десния ръб:
За бутони като Close, които традиционно са в долния десен ъгъл, поведение 3 е това, което е необходимо. ListViews и DataGridViews са най-добри с 2, ако броят на колоните е достатъчен за препълване на формата и се нуждае от превъртане). Горните и левите котви са по подразбиране. Прозорецът за собственост включва изящен малък редактор, който прилича на знамето на Англия. Просто щракнете върху някоя от лентите (две хоризонтални и две вертикални), за да зададете или изчистите подходящата котва, както е показано на снимката по-горе.
Едно свойство, което не се споменава много, е свойството Tag и въпреки това може да бъде невероятно полезно. В прозореца със свойства можете да присвоите само текст, но във вашия код можете да имате всяка стойност, която се спуска от Object.
Използвах Tag, за да държа цял обект, докато показвам само няколко негови свойства в ListView. Например може да искате само да покажете име и номер на клиент в списък с обобщения на клиента. Но кликнете с десния бутон върху избрания клиент и след това отворете формуляр с всички данни на клиента. Това е лесно, когато съставяте списъка с клиенти, като четете всички данни на клиента в паметта и зададете препратка към обекта на клиентския клас в маркера. Всички контроли имат етикет.
A TabControl е удобен начин да спестите пространство на формата, като имате няколко раздела. Всеки раздел може да има икона или текст и можете да изберете всеки раздел и да покажете неговите контроли. TabControl е контейнер, но съдържа само TabPages. Всяка TabPage е също контейнер, който може да има добавени нормални контроли към нея.
В пример x7.cs, създадох панел с два раздела с първия раздел, наречен Контроли с три бутона и квадратче за отметка. Втората страница с раздели е означена „Дневници“ и се използва за показване на всички регистрирани действия, което включва щракване на бутон или превключване на квадратче за отметка. Метод, наречен Log (), се извиква за регистриране на всяко натискане на бутон и т.н. Той добавя предоставения низ в ListBox.
Добавих и два изскачащи менюта с десния бутон на мишката към TabControl по обичайния начин. Първо добавете ContextMenuStrip към формата и го задайте в свойството ContextStripMenu на TabControl. Двата варианта на менюто са Добавяне на нова страница и Премахване на тази страница. Ограничих обаче премахването на страницата, така че могат да бъдат премахнати само ново добавени страници в раздели, а не оригиналните две.
Това е лесно, просто създайте нова страница в раздела, дайте й надпис Text за Tab и след това го добавете към колекцията TabPages на Tabs TabControl
Премахването на страница е само въпрос на обаждане на TabPages. RemoveAt (), използвайки раздели. SelectedIndex, за да получите текущо избрания раздел.
В този урок видяхме как работят някои от по-сложните контроли и как да ги използваме. В следващия урок ще продължа с темата на GUI и ще разгледам нишката на работния фон и ще покажа как да го използвам.