Programování pokročilých winformů v C #

click fraud protection

V tomto programovacím tutoriálu C # se soustředím na pokročilé ovládací prvky, jako jsou ComboBoxy, tabulky a seznamy, a ukážu vám, jak je budete pravděpodobně používat. Nedotýkám se dat a vazeb až do pozdějšího návodu. Začněme jednoduchým ovládáním, ComboBoxem.

Srdcem komba je kolekce položek a nejjednodušší způsob, jak naplnit toto je rozbalovat kombo na obrazovce, vyberte vlastnosti (Pokud nevidíte okna vlastností, klikněte na Zobrazit v horní nabídce a poté na Okno Vlastnosti), najděte položky a klikněte na elipsy. knoflík. Poté můžete zadat řetězce, zkompilovat program a rozbalit seznam dolů, abyste viděli volby.

Nyní zastavte program a přidejte několik dalších čísel: čtyři, pět.. až deset. Když jej spustíte, uvidíte pouze 8, protože to je výchozí hodnota MaxDropDownItems. Neváhejte jej nastavit na 20 nebo 3 a poté jej spusťte, abyste viděli, co dělá.

Je nepříjemné, že když se otevře, říká comboBox1 a můžete jej upravit. To není to, co chceme. Najděte vlastnost DropDownStyle a změňte DropDown na DropDownList. (Je to kombo!). Nyní není žádný text a nelze jej upravovat. Můžete vybrat jedno z čísel, ale vždy se otevře prázdné. Jak vybereme číslo, které začínáme? Není to vlastnost, kterou můžete nastavit v době návrhu, ale přidání této řádky to udělá.

instagram viewer

Přidejte tento řádek do konstruktoru Form1 (). Musíte zobrazit kód formuláře (v aplikaci Solution Explorer klepněte pravým tlačítkem myši na From1.cs a klepněte na příkaz Zobrazit kód. Najít InitializeComponent (); a přidejte tento řádek ihned poté.

Pokud nastavíte vlastnost DropDownStyle pro combo na Simple a spustíte program, nedostanete nic. Nevybere ani neklikne nebo neodpoví. Proč? Protože v době návrhu musíte uchopit spodní protahovací rukojeť a celou kontrolu zvýšit.

V příkladu 2 jsem přejmenoval ComboBox na combo, změnil combo DropDownStyle zpět na DropDown, aby mohl být upraven a přidán tlačítko Add s názvem btnAdd. Dvakrát jsem klikl na tlačítko Přidat a vytvořil obslužný program události btnAdd_Click () a přidal tento řádek události.

Nyní, když spustíte program, zadejte nové číslo, řekněte Jedenáct a klikněte na Přidat. Obsluha události vezme text, který jste zadali (v rozbalovacím seznamu). Text) a přidá ji do kolekce položek Combo. Klikněte na Combo a nyní máme novou položku Jedenáct. Takto přidáte do Combo nový řetězec. Odstranění jednoho je o něco složitější, protože musíte najít index řetězce, který chcete odstranit, a poté jej odstranit. Metoda RemoveAt ukázaná níže je metoda kolekce, jak toho dosáhnout. stačí určit, která položka v parametru Removeindex.

odstraní řetězec na pozici RemoveIndex. Pokud v kombo jsou n položky, pak platné hodnoty jsou 0 až n-1. Pro 10 položek, hodnoty 0..9.

Pokud to nenajde text, vrací -1, jinak vrátí index založený na 0 řetězci v seznamu se seznamem. K dispozici je také přetížená metoda FindStringExact, která umožňuje určit, odkud začnete hledat, takže můžete přeskočit první atd., Pokud máte duplikáty. To by mohlo být užitečné při odstraňování duplikátů ze seznamu.

Kliknutím na btnAddMany_Click () se text vymaže z rozbalovacího seznamu, pak se vymaže obsah kolekce rozbalovacích položek a poté se vytočí. AddRange (pro přidání řetězců z pole hodnot. Poté, co to udělá, nastaví combo's SelectedIndex na 0. To ukazuje první prvek v rozbalovacím seznamu. Pokud provádíte přidání nebo odstranění položek v ComboBoxu, je nejlepší sledovat, která položka je vybrána. Nastavení SelectedIndex na -1 skryje vybrané položky.

Tlačítko Přidat spoustu vymaže seznam a přidá 10 000 čísel. Přidal jsem kombo. BeginUpdate () a combo, EndUpdate () volá po smyčce, aby se zabránilo jakémukoli blikání ze systému Windows při pokusu o aktualizaci ovládacího prvku. Na mém tříletém počítači trvá něco přes sekundu, než do kombo přidám 100 000 čísel.

Toto je šikovný ovládací prvek pro zobrazování tabulkových dat bez složitosti mřížky. Můžete zobrazit položky jako velké nebo malé ikony, jako seznam ikon ve svislém seznamu nebo nejužitečněji jako seznam položek a dílčích položek v mřížce a to uděláme zde.

Po přetažení ListView do formuláře klikněte na vlastnost sloupce a přidejte 4 sloupce. Budou to TownName, X, Y a Pop. Nastavte text pro každý ColumnHeader. Pokud nevidíte nadpisy v seznamu ListView (po přidání všech 4), nastavte vlastnost Zobrazit ListView na Podrobnosti. Pokud zobrazíte kód pro tento příklad, přejděte dolů k místu, kde je napsán kód Windows Form Designer, a rozbalte oblast, kde uvidíte kód, který vytváří ListView. Je užitečné vidět, jak systém funguje, a můžete tento kód zkopírovat a použít sami.

Šířku pro každý sloupec můžete nastavit ručně přesunutím kurzoru nad záhlaví a přetažením. Nebo to můžete udělat v kódu viditelném po rozšíření oblasti návrháře formuláře. Měli byste vidět kód takto:

Ve sloupci populace se změny v kódu projeví v návrháři a naopak. Všimněte si, že i když nastavíte vlastnost Locked na true, ovlivní to pouze návrháře a za běhu můžete změnit velikost sloupců.

ListViews také přicházejí s řadou dynamických vlastností. Klikněte na (Dynamické vlastnosti) a zaškrtněte požadovanou vlastnost. Když nastavíte vlastnost na dynamickou, vytvoří soubor XML .config a přidá jej do aplikace Solution Explorer.

Provedení změn v době návrhu je jedna věc, ale my to opravdu musíme udělat, když je program spuštěn. ListView se skládá z 0 nebo více položek. Každá položka (ListViewItem) má vlastnost text a kolekci SubItems. První sloupec zobrazuje text položky, další sloupec zobrazuje SubItem [0] .text, potom SubItem [1] .text atd.

Přidal jsem tlačítko pro přidání řádku a editačního pole pro název města. Do pole zadejte libovolný název a klikněte na Přidat řádek. Tím se do seznamu ListView přidá nový řádek s názvem města vloženým do prvního sloupce a dalších tří sloupců (SubItems [0..2]) jsou vyplněny náhodnými čísly (převedeny na řetězce) přidáním těchto řetězců do jim.

Nyní nastavte vlastnost ListView Multiselect na false. Chceme vybrat pouze jednu položku najednou, ale pokud si přejete odebrat více najednou, je to podobné, kromě toho, že musíte opakovat zpět. (Pokud opakujete v normálním pořadí a odstraníte položky, následující položky nejsou synchronizovány s vybranými indexy).

Nabídka s pravým tlačítkem myši zatím nefunguje, protože v ní nemáme žádné položky nabídky. Klikněte pravým tlačítkem myši na položku PopupMenu (pod formulářem) a v horní části formuláře se zobrazí kontextová nabídka, kde se zobrazuje normální editor nabídek. Klikněte na něj a tam, kde je uvedeno Type Here, napište Remove Item. V okně vlastností se zobrazí MenuItem tak přejmenovaný na mniRemove. Poklepejte na tuto položku nabídky a měli byste získat funkci kódu obsluhy události menuItem1_Click. Přidejte tento kód, aby to vypadalo takto.

Pokud ztratíte přehled o Odebrat položku, stačí kliknout na ovládací prvek PopupMenu samostatně pod formulář ve formuláři Návrháře formuláře. To ji přivede zpět na dohled.

Pokud ji však spustíte a nepřidáte položku a nevyberete ji, když kliknete pravým tlačítkem myši a dostanete nabídku a kliknete na Odstranit položku, udělí výjimku, protože neexistuje žádná vybraná položka. To je špatné programování, tak to napravíte. Poklepejte na vyskakovací událost a přidejte tento řádek kódu.

DataGridView je nejkomplexnější a zároveň nejužitečnější komponenta poskytovaná zdarma s C #. Funguje s oběma zdroji dat (tj. Daty z databáze) i bez (tj. Daty, která přidáváte programově). Po zbytek tohoto tutoriálu ukážu jeho použití bez zdrojů dat. Pro jednodušší potřeby zobrazení se vám může hodit obyčejný ListView.

Pokud jste použili starší ovládací prvek DataGrid, pak je to jen jeden z těch na steroidech: dává vám více vestavěných typů sloupců, s nimiž můžete pracovat interní i externí data, větší přizpůsobení zobrazení (a událostí) a dává větší kontrolu nad manipulací s buňkami pomocí zmrazených řádků a sloupce.

Při navrhování formulářů s daty mřížky je nejběžnější určit různé typy sloupců. V jednom sloupci byste mohli mít zaškrtávací políčka, v jiném sloupci pouze pro čtení nebo upravitelný text a čísla kurzů. Tyto typy sloupců jsou také obvykle zarovnány rozdílně s čísly, které jsou obecně zarovnané vpravo, takže se desetinná místa zarovnávají. Na úrovni sloupce si můžete vybrat z tlačítek, zaškrtávací políčko, ComboBox, obrázek, textové pole a odkazy. pokud to nestačí, můžete defibrovat své vlastní typy.

Nejjednodušší způsob přidání sloupců je návrh v IDE. Jak jsme viděli dříve, jen vám to píše kód a když jste to udělali několikrát, můžete raději přidat kód sami. Poté, co jste to několikrát udělali, vám poskytne informace o tom, jak to udělat programově.

Začněme přidáním několika sloupců, přetažení DataGridView do formuláře a kliknutím na malou šipku v pravém horním rohu. Poté klikněte na Přidat sloupec. Udělej to třikrát. Zobrazí se dialogové okno Přidat sloupec, ve kterém nastavíte název sloupce, text zobrazený v horní části sloupce a umožní vám vybrat jeho typ. První sloupec je YourName a je to výchozí TextBox (dataGridViewTextBoxColumn). Nastavte také text záhlaví na vaše jméno. Vytvořte druhý sloupec Age a použijte ComboBox. Třetí sloupec je povolen a je sloupcem CheckBoxu.

Po přidání všech tří byste měli vidět řadu tří sloupců s kombo v prostředním (věk) a zaškrtávací políčko ve sloupci Povoleno. Pokud kliknete na DataGridView, pak v inspektoru vlastností byste měli vyhledat sloupce a kliknout na (kolekce). Otevře se dialogové okno, ve kterém můžete nastavit vlastnosti pro každý sloupec, jako jsou jednotlivé barvy buněk, text nápovědy, šířka, minimální šířka atd. Pokud kompilujete a spustíte, všimnete si, že můžete změnit šířku sloupce a dobu běhu. V inspektoru vlastností hlavního DataGridView můžete nastavit AllowUser tak, aby změnil velikost sloupců na false, aby tomu zabránil.

Chystáme přidat řádky do ovládacího prvku DataGridView v kódu a ex3.cs v souboru příkladů má tento kód. Počínaje přidáním pole TextEdit, ComboBox a tlačítka do formuláře s DataGridView na něm. Nastavte vlastnost DataGridView AllowUserto AddRows na false. Také používám štítky a nazývám kombobox cbAges, tlačítko btnAddRow a TextBox tbName. Přidal jsem také tlačítko Zavřít do formuláře a dvakrát na něj vytvořil kostru obsluhy události btnClose_Click. Přidáte-li slovo Close (), bude to fungovat.

Ve výchozím nastavení je vlastnost Přidat tlačítko povolena řádek nastavena na hodnotu false. Nechceme přidat žádné řádky do DataGridView, pokud v poli Název TextEdit a ComboBox není text. Vytvořil jsem metodu CheckAddButton a vygeneroval obslužný program události Leave pro textové pole Name Text dvojitým kliknutím vedle slova Leave ve vlastnostech, když zobrazoval události. Pole Vlastnosti to ukazuje na obrázku výše. Ve výchozím nastavení pole Vlastnosti zobrazuje vlastnosti, ale obslužné rutiny událostí můžete zobrazit kliknutím na tlačítko blesku.

Místo toho můžete použít událost TextChanged, i když to bude volat CheckAddButton () metoda pro každé stisknutí klávesy, spíše než když je ovládací prvek opuštěn, tj. když získá další ovládací prvek soustředit se. V Ages Combo jsem použil událost TextChanged, ale místo dvojitého kliknutí jsem vybral obslužný program události tbName_Leave místo vytvoření nového obslužného programu události.

Ne všechny události jsou kompatibilní, protože některé události poskytují další parametry, ale pokud vidíte dříve vygenerovaný obslužný program, můžete jej použít. Je to většinou otázka preference, můžete mít samostatný obslužný program události pro každou kontrolu, kterou jste použití nebo sdílení obsluhy událostí (jako já), když mají společný podpis události, tj. parametry jsou stejný.

Přejmenoval jsem komponentu DataGridView na dGView pro stručnost a dvakrát klikněte na AddRow, aby se vygenerovala kostra obsluhy událostí. Tento kód přidává nový prázdný řádek a získává tento index řádků (je to RowCount-1, protože byl právě přidán a RowCount je 0) založené) a poté přistupuje k tomuto řádku prostřednictvím svého indexu a nastavuje hodnoty v buňkách v tomto řádku pro sloupce YourName a Stáří.

Při navrhování formuláře byste měli přemýšlet o kontejnerech a kontrolách a o tom, které skupiny kontrol by měly být drženy pohromadě. V západních kulturách přesto lidé čtou od horního doleva k pravému dolnímu, takže je tak snadnější číst.

Kontejner je libovolný ovládací prvek, který může obsahovat další ovládací prvky. Mezi prvky nalezené v panelu nástrojů patří Panel, FlowLayoutpanel, SplitContainer, TabControl a TableLayoutPanel. Pokud panel nástrojů nevidíte, použijte nabídku Zobrazit a najdete ji. Kontejnery drží ovládací prvky pohromadě a pokud přesunete nebo změníte velikost kontejneru, bude to mít vliv na umístění ovládacích prvků. Jednoduše přesuňte ovládací prvky nad kontejnerem v Návrháři formulářů a zjistí, že kontejner je nyní na starosti.

Panel je podobný GroupBoxu, ale GroupBox se nemůže posouvat, ale může zobrazit titulek a ve výchozím nastavení má ohraničení. Panely mohou mít hranice, ale ve výchozím nastavení ne. Používám GroupBoxes, protože vypadají hezčí, a to je důležité, protože:

Panely jsou vhodné také pro seskupování kontejnerů, takže můžete mít na panelu dva nebo více GroupBoxů.

Tady je tip pro práci s kontejnery. Přetažení Split kontejneru do formuláře. Klikněte na levý a poté na pravý. Nyní zkuste SplitContainer z formuláře odebrat. Je to obtížné, dokud nekliknete pravým tlačítkem na jeden z panelů a poté klepněte na Vybrat SplitContainer1. Jakmile je vše vybráno, můžete jej odstranit. Dalším způsobem, který platí pro všechny ovládací prvky a kontejnery, je stiskněte klávesu Esc vybrat rodiče.

Kontejnery mohou také hnízdit uvnitř sebe. Jednoduše přetáhněte malý na větší, a krátce se objeví krátká svislá čára, která ukazuje, že jeden je nyní uvnitř druhého. Když přetáhnete nadřazený kontejner, dítě se s ním přesune. Příklad 5 to ukazuje. Ve výchozím nastavení není světle hnědý panel uvnitř kontejneru, takže po kliknutí na tlačítko Přesunout se přesune GroupBox, ale panel není. Nyní panel přetáhněte přes GroupBox tak, aby byl úplně uvnitř Groupboxu. Když zkompilujete a spustíte tento čas, klepnutím na tlačítko Přesunout se oba pohnou.

TableLayoutpanel je zajímavý kontejner. Je to struktura tabulky uspořádaná jako 2D mřížka buněk, kde každá buňka obsahuje pouze jeden ovládací prvek. V buňce nemůžete mít více než jednu kontrolu. Můžete určit, jak se tabulka zvětší, když se přidají další ovládací prvky, nebo dokonce, pokud se nezvětší, zdá se, že je modelována v tabulce HTML, protože buňky mohou přesahovat sloupce nebo řádky. Dokonce i chování kotvení podřízených ovládacích prvků v kontejneru závisí na nastavení Margin a Padding. Více o kotvách uvidíme na další stránce.

V příkladu Ex6.cs jsem začal se základní tabulkou se dvěma sloupci a určil se v dialogovém okně Styly řízení a stylů (vyberte ovládací prvek a klikněte na malé pravý polohovací trojúhelník umístěný vpravo nahoře a zobrazí se seznam úkolů a klikněte na poslední), že levý sloupec je 40% a pravý sloupec 60% šířka. Umožňuje určit šířku sloupců v absolutních pixelech, v procentech, nebo ji můžete nechat pouze automatickou změnu velikosti. Rychlejší způsob, jak se dostat do tohoto dialogu, je pouze kliknout na Sbírku vedle Sloupce v okně Vlastnosti.

Přidal jsem tlačítko AddRow a ponechal vlastnost GrowStyle s výchozí hodnotou AddRows. Když se tabulka zaplní, přidá další řádek. Případně můžete nastavit její hodnoty na AddColumns a FixedSize, takže již nemohou růst. V Ex6, když klepnete na tlačítko Přidat ovládací prvky, zavolá metodu AddLabel () třikrát a AddCheckBox () jednou. Každá metoda vytvoří instanci ovládacího prvku a poté volá tblPanel. Řízení. Přidat () Po přidání druhého ovládacího prvku způsobí třetí ovládací prvky růst tabulky. Obrázek je zobrazen po kliknutí na tlačítko Přidat ovládací prvek.

V případě, že jste zvědaví, odkud výchozí hodnoty pocházejí z metod AddCheckbox () a AddLabel (), které volám, byla kontrola původně ručně přidán do tabulky v návrháři a poté kód, z něhož byl vytvořen a inicializován, byl z tohoto zkopírován oblast. Inicializační kód najdete v volání metody InitializeComponent, jakmile kliknete na + vlevo od oblasti níže:

Můžete vybrat více ovládacích prvků současně přidržením klávesy Shift, když vyberete druhý a následující ovládací prvky, dokonce i ovládací prvky různých typů. V okně Vlastnosti se zobrazují pouze vlastnosti společné pro oba, takže je můžete všechny nastavit na stejnou velikost, barvu a textová pole atd. Dokonce stejné ovladače událostí mohou být přiřazeny více ovládacím prvkům.

V závislosti na použití bude u některých formulářů často dojít ke změně velikosti uživatelem. Nic nevypadá hůře, než změna velikosti formuláře a zobrazení ovládacích prvků zůstává ve stejné poloze. Všechny ovládací prvky mají kotvy, které vám umožňují „připojit“ je ke 4 hranám, takže se ovládací prvek při pohybu připojené hrany pohybuje nebo protahuje. To vede k následujícímu chování při natažení formuláře z pravého okraje:

Pro tlačítka jako Close, která jsou tradičně vpravo dole, je potřeba chování 3. ListViews a DataGridViews jsou nejlepší s 2, pokud je počet sloupců dostatečný k přetečení formuláře a vyžaduje rolování). Výchozí jsou kotvy nahoře a vlevo. Okno vlastností obsahuje šikovný malý editor, který vypadá jako vlajka Anglie. Stačí kliknout na některý z prutů (dva vodorovné a dva svislé) a nastavit nebo zrušit příslušnou kotvu, jak je znázorněno na obrázku výše.

Jednou z vlastností, která se příliš nezmíní, je vlastnost Tag a přesto může být neuvěřitelně užitečná. V okně Vlastnosti můžete přiřadit pouze text, ale v kódu můžete mít libovolnou hodnotu, která pochází z objektu.

Značku jsem použil k držení celého objektu, zatímco v ListView jsem zobrazoval pouze několik jeho vlastností. Například byste mohli chtít zobrazit pouze jméno a číslo zákazníka v seznamu zákazníků. Ale klikněte pravým tlačítkem na vybraného zákazníka a pak otevřete formulář se všemi detaily zákazníka. To je snadné, pokud při vytváření seznamu zákazníků čtete všechny detaily zákazníka v paměti a přiřadíte odkaz na objekt třídy zákazníka ve značce. Všechny ovládací prvky mají značku.

TabControl je praktický způsob, jak ušetřit prostor ve formuláři tím, že má více karet. Každá karta může mít ikonu nebo text a můžete vybrat kteroukoli kartu a zobrazit její ovládací prvky. TabControl je kontejner, ale obsahuje pouze TabPages. Každá TabPage je také kontejner, do kterého lze přidat normální ovládací prvky.

V příkladu x7.cs jsem vytvořil panel se dvěma záložkami s první kartou nazvanou Controls, která má tři tlačítka a zaškrtávací políčko. Druhá stránka s záložkami je označena Protokoly a slouží k zobrazení všech zaznamenaných akcí, které zahrnují kliknutí na tlačítko nebo přepnutí zaškrtávacího políčka. Je volána metoda nazvaná Log (), která zaznamená každé kliknutí na tlačítko atd. Přidá dodaný řetězec do seznamu.

Obvyklým způsobem jsem do TabControl také přidal dvě položky s pravým tlačítkem myši. Nejprve do formuláře přidejte ContextMenuStrip a nastavte jej ve vlastnosti ContextStripMenu v TabControl. Dvě možnosti nabídky jsou Přidat novou stránku a Odebrat tuto stránku. Odstranění stránky jsem však omezil, takže lze odebrat pouze nově přidané stránky karet, nikoli původní dvě.

Je to snadné, stačí vytvořit novou stránku s kartami, dát jí textový popisek pro kartu a přidat jej do kolekce TabPages v záložkách TabControl

Odstranění stránky je jen otázkou volání TabPages. RemoveAt () pomocí záložek. SelectedIndex pro získání aktuálně vybrané záložky.

V tomto tutoriálu jsme viděli, jak fungují některé sofistikovanější ovládací prvky a jak je používat. V dalším tutoriálu budu pokračovat v tématu GUI a podívám se na podproces pracovníka na pozadí a ukážu, jak ho používat.

instagram story viewer