Hogyan készítsünk saját összetett vezérlés (kompozit kontroll) WinForms, notebook
Célkitűzés: Ahhoz, hogy egy egyéni kontroll (kontroll) Windows Froms. Mi ez? Van néhány különböző lehetőségeket, a téma ez a cikk a DateTimePicker saját, képes együttműködni üres dátumokat. Mint egy üres időpontra aktívan használja az osztály korábban ismertetett DatePlus. Mit akarunk? Lényegében, szükségünk van egy álarcos TextBox dátumának beírásával, a naptári pop-up gombbal hívja számos szolgáltató funkciók - csomagolva egy egyszerű shell. Plusz gomb kézzel kell kibontakozó felfelé vagy lefelé attól függően, hogy a naptár.
Jó MSDN azt mondja, hogy az egyéni upravlyatory három csoportba sorolhatók:
- kompozit (kompozit), kombinálásával több meglévők készült nasledovaneim a UserControl
- bővült, hozzátéve valami újat a meglévő ellenőrzési, kész összevetjük osztály öröklési
- nem szabványos (egyéni), amely átalakították teszi a képernyőn
Nyilvánvaló, hogy szükségünk van egy összetett ellenőrzés. Az utolsó darab az elmélet, mielőtt a kód - szemszögéből az operációs rendszer Windows Forms, minden elem egy külön ablakban. Azaz, mi van a fő ablak - formájában, amelynek belsejében felüléseket egy kisebb, amelyen belül lehet ülni akár kisebb ablak (pl csoportpanelen és néhány gomb belsejében).
A stúdióban, akkor csak add, hogy a projekt „felhasználó ellenőrzése”, és kap egy tervező, hogy nagyon hasonlít a tervező, a szokásos formáját, és dobd rá a MaskedTextBox, gomb és a naptár. Ha rákattint a gombra, meg kell jelennie, és eltűnnek naptár - ez úgy érhető el, hogy egyszerűen kicseréljük a mérete egy beállítást.
Itt jön az első probléma - a standard naptár nem terjed túl a szülő formában. Azaz, ha teszünk a mi csodálatos datavzyator alján vagy a jobb szélén a forma, a naptár lesz levágva. Azt akarom, hogy legyen szép a levegőben lebegett, mint egy virtuális előugró menüben. A gombra kattintva - jelenik meg, kattintson a gombra, vagy azon kívül - eltűnnek. Hogy ezek a kattintások kutya és eltemették.
A StackOverflow mi azt tanácsoljuk, hogy örökölt az alapelem ToolStripDropDown felugró menüből. Minden csodálatos úszók és mászik, de van egy csomó probléma automatikusan lezárja a pop-up menü - van elrejtve valahol, nagyon mélyen a gyomrában a rendszer. A pálya van szükség, hogy megfelelően teljesíti a kézi nyitás és zárás, ha a gombra kattintva. Auto-viselkedő nagyon furcsa és logikátlan, az utolsó csepp volt számomra az a tény, hogy a gombra kattint zajlik az események előtt ténylegesen később rákattint egy gombra. A végén, én kiköpött a perverz kódot bypass mindezen hibák és festett designer mini-alak, a naptárat, amelybe már azt mutatják, / közel egy kattintással.
De, hogy pontosan hol van a formája a kimenet? Végtére is, a helyét a mi upravlyatora nem tudjuk előre. Koordinátákat a visszavonását formájában kell újraszámolni a relatív kordinaty belsejében egy szülő ablak vezérlő és visszajelzést.
Auto utánzott nagyon egyszerű - tegye elrejtése hívás deaktiválása Event
Csak azért, hogy felejtsük el, hogy a MonthCalendar alapértelmezett dátumtartományban, de csak kell egy - a választás napját tartományban kell összeomlik. A legkényelmesebb módja ennek belülről formájában.
Kitűnő. Ez nem csak durran ki és be, hanem a nyitás-zárás. Kezdjük tesztelése eltérő betűméretet az űrlapon, és szembesülnek egy másik érdekes hibák - MaskedTextBox skálázott aránytalanul annak tartalmát. Leegyszerűsítve növelésével string tartalmát betűméret már nem az ő mászni, és levágta (persze, akkor lépjünk a végén a kurzor). A kezelt ezt glitch és nem várt módon - beállítás átlátszó háttérszín közös UserControl-tartályba.
Tovább hiba látható közvetlenül a tervező - ha másol egy elemet a Ctrl + húzás az alapvető konténer ellenőrzési nyúlik. Emellett nehéz viszonyított helyzete más elemeket. Treat az alábbiak szerint:
1. nullázás belső elemek ingatlan Margó szerkesztés Location hogy őket a határhoz közeli, s elhúzta a UserControl
2. Helyezze a AutoScaleMode Front, autoSize' -> igaz, AutoSizeMode -> GrowAndShrink
Az utolsó hiba annak a ténynek köszönhető, hogy a naptár mi lesz külön űrlapot, és a betűméret nem lehet továbbítani, illetve a méret a naptár nem fog változni, miután a méret a vezérlőelem és az alapvető formája. nem tudjuk meg a kulcsot a kivitelező, mint a mi upravlyator betűméret fog jönni később. A legegyszerűbb - kérdezze meg a levezetése a naptár a képernyőn.
Mit mi maradt? A nyíl a gombra! Kell változtatni a kép futási időben, és a legegyszerűbb módja ennek az, úgy, hogy a ImageList ellenőrzés a tervező és ugyanaz a kép feltöltése. A kód triviális változtatni.
A nagyobb szabadságot, annál több problémát. Ha a felhasználó megadja a dátumot a szöveget, ő is írja, hogy rosszul! És felveti egy külön kérdés, hogy figyelembe kell venni a helyes - például hogy a felhasználó adja meg a dátumot a jövőben? Néha néha lehetetlen. Így van értelme, hogy vezessenek be külön paraméter a dátum beállításához a jövőben, és hogy azt a tulajdonságok panel VisualStudio tervező
Add a funkciót, hogy ellenőrizze a helyességét a dátumokat.
Végül rendesen feldolgozni Timestamping a naptárban, tekintettel arra, hogy a dátumtártományt is korlátozott, és ha a dátum lesz mögötte, aztán betette a naptár nem szükséges
Megadása hibás érték szükséges a megtalálásához és lőni rávenni a felhasználót, hogy ilyen csúnya dolog. Viszonylag megbízható követési felhasználó MaskedTextBox exit voltam képes, hogy egy nyomkövető, validált és MouseLeave eseményeket. Gyakran proiskholdya egymást úgy, hogy látható legyen az ablak a hibaüzenetet is kell nyomon követni, hogy ne megjelenik egy ablak kétszer.
Ha a rossz vonal még fel az erős akaratú döntést az adott időpontban egy üres.
Összegyűjti az összes együtt, hogy a vizsgált projekt WinForms összes fenti osztályok, gyűjtött egy külön dll és vizsgálati forma