Vynechanie riadiacich polí z VB.NET je výzvou pre tých, ktorí učia o poliach.
- Už nie je možné jednoducho kopírovať ovládací prvok, napríklad textové pole, a potom ho prilepiť (raz alebo viackrát) a vytvoriť kontrolné pole.
- Kód VB.NET na vytvorenie štruktúry podobnej kontrolnému poli bol vo všetkých knihách o VB.NET, ktoré som kúpil a online, oveľa dlhší a oveľa komplexnejší. Chýba mu jednoduchosť kódovania kontrolného poľa, ktoré sa nachádza vo VB6.
Ak odkazujete na knižnicu kompatibility VB6, existujú tam objekty, ktoré fungujú skoro ako kontrolné polia. Ak chcete vidieť, čo tým myslím, jednoducho použite sprievodcu inováciou na VB.NET s programom, ktorý obsahuje kontrolné pole. Kód je opäť škaredý, ale funguje to. Zlou správou je, že spoločnosť Microsoft nezaručuje, že komponenty kompatibility budú naďalej podporované a nemáte ich používať.
Kód VB.NET na vytváranie a používanie „riadiacich polí“ je oveľa dlhší a oveľa komplexnejší.
Podľa Microsoftu urobiť niečo, čo je blízko tomu, čo môžete urobiť vo VB 6, si vyžaduje vytvorenie „jednoduchej súčasti, ktorá duplikuje funkčnosť riadiaceho poľa“.
Na ilustráciu potrebujete novú triedu aj hostiteľský formulár. Trieda skutočne vytvára a ničí nové štítky. Celý kód triedy je nasledujúci:
Public Class LabelArray
Zdedí systém. Kolekcia. CollectionBase
Súkromné ReadOnly HostForm As _
Systém. Windows. Formy. formulár
Verejná funkcia AddNewLabel () _
Ako systém. Windows. Formy. štítok
'Vytvorte novú inštanciu triedy Label.
Dim aLabel ako nový systém. Windows. Formy. štítok
„Pridajte štítok do zbierky
'interný zoznam.
Me. List. Pridať (aLabel)
'Pridajte štítok do kolekcie Kontroly
'formulára, na ktorý odkazuje pole HostForm.
HostForm. Controls. Pridať (aLabel)
'Nastaviť intimálne vlastnosti objektu Label.
aLabel. Top = Count * 25
aLabel. Šírka = 50
aLabel. Vľavo = 140
aLabel. Značka = Me. počítať
aLabel. Text = "Label" & Me. Počítať. Natiahnuť
Vráťte aLabel
Ukončenie funkcie
Public Sub New (_
ByVal hostiteľ ako systém. Windows. Formy. forma)
HostForm = hostiteľ
Me. AddNewLabel ()
End Sub
Predvolené verejné vlastníctvo typu ReadOnly _
Položka (index ByVal ako celé číslo) ako _
Systém. Windows. Formy. štítok
dostať
Návrat CType (zoznam mi. Položka (index), _
Systém. Windows. Formy. Label)
End Get
Ukončiť vlastníctvo
Odstránenie verejných čiastkových dielcov ()
„Skontrolujte, či existuje štítok, ktorý chcete odstrániť.
Ak ja. Počítať> 0 Potom
'Odstráňte posledný štítok pridaný do poľa
“z kolekcie ovládacích prvkov hostiteľa.
'Všimnite si použitie predvolenej vlastnosti v systéme
'prístup do poľa.
HostForm. Controls. Odstrániť (Me (Me. Počet - 1))
Me. List. RemoveAt (počet osôb - 1)
Koniec Ak
End Sub
Koncová trieda
Na ilustráciu spôsobu použitia tohto kódu triedy môžete vytvoriť formulár, ktorý ho volá. Mali by ste použiť kód uvedený nižšie v tvare:
Formulár verejnej triedy1. Zdedí systém. Windows. Formy. Formulár. #Region „Kód vygenerovaný programom Windows Form Designer“ 'Musíte tiež pridať príkaz:' MyControlArray = New LabelArray (Me) 'po výzve InitializeComponent () v. 'skrytý kód regiónu. 'Vyhlásiť nový objekt ButtonArray. Dim MyControlArray ako LabelArray. Súkromná sub btnLabelAdd_Click (_. ByVal odosielateľ ako systém. Objekt, _. ByVal e As System. EventArgs) _. Rukoväte btnLabelAdd. Kliknite na tlačidlo. 'Zavolajte metódu AddNewLabel. 'MyControlArray. MyControlArray. AddNewLabel () „Zmeňte vlastnosť BackColor. tlačidla 0. MyControlArray (0) .BackColor = _. Systém. Kreslenie. Farbu. Red. End Sub. Súkromná sub btnLabelRemove_Click (_. ByVal odosielateľ ako systém. Objekt, _. ByVal e As System. EventArgs) _. Rukoväte btnLabelRemove. Kliknite na tlačidlo. 'Zavolajte metódu Odstrániť MyControlArray. MyControlArray. Odstrániť () End Sub. Koncová trieda
Po prvé, toto nerobí prácu v Design Time, ako sme to robili vo VB 6! A po druhé, nie sú v poli, sú v kolekcii VB.NET - omnoho iná vec ako pole.
Dôvod, prečo VB.NET nepodporuje „kontrolné pole“ VB 6, je ten, že neexistuje nič ako „kontrolné pole“ (všimnite si zmenu úvodzoviek). VB 6 vytvára kolekciu v zákulisí a robí ju vývojárom ako pole. Nie je to však pole a máte nad ním len malú kontrolu nad funkciami, ktoré poskytuje IDE.
Na druhej strane to VB.NET nazýva to, čo to je: súbor objektov. A odovzdajú kľúče od kráľovstva vývojárovi tým, že celú vec vytvoria priamo vonku.
Ako príklad druhu výhod to dáva vývojárovi, vo VB 6 museli byť ovládacie prvky rovnakého typu a museli mať rovnaké meno. Pretože to sú iba objekty vo VB.NET, môžete ich urobiť rôznymi typmi a dať im rôzne názvy a stále ich spravovať v rovnakej kolekcii objektov.
V tomto príklade rovnaká udalosť Kliknutia spracováva dve tlačidlá a začiarkavacie políčko a zobrazuje, na ktoré z nich ste klikli. Urobte to v jednom riadku kódu pomocou VB 6!
Private Sub MixedControls_Click (_
ByVal odosielateľ ako systém. Objekt, _
ByVal e As System. EventArgs) _
Rukoväte Button1.Click, _
Button2.Click, _
CheckBox1.Click
„Vyhlásenie uvedené nižšie musí byť jedno dlhé vyhlásenie!
„Je to tu na štyroch riadkoch, aby to zostalo úzke
'dosť na to, aby sa zmestili na webovú stránku
Label2.Text =
Microsoft. VisualBasic. Právo (odosielateľ. GetType. Natiahnuť,
Len (odosielateľ. GetType. Natiahnuť) -
(InStr (odosielateľ. GetType. ToString, „Formuláre“) + 5))
End Sub
Výpočet podreťazcov je trochu zložitý, ale v skutočnosti to nie je to, o čom tu hovoríme. V udalosti Click by ste mohli urobiť čokoľvek. Môžete napríklad použiť typ ovládacieho prvku vo výpise If na rôzne veci pre rôzne ovládacie prvky.
Spätná väzba od Franka pre počítačové štúdie o poliach
Frankova študijná skupina poskytla príklad s formulárom, ktorý má 4 štítky a 2 tlačidlá. Tlačidlo 1 vymaže štítky a tlačidlo 2 ich vyplní. Je dobré znova si prečítať Frankovu pôvodnú otázku a všimnúť si, že príkladom, ktorý použil, bola slučka, ktorá sa používa na vyčistenie vlastnosti Caption zo súboru komponentov Label. Toto je ekvivalent VB.NET tohto kódu VB 6. Tento kód robí to, čo Frank pôvodne požadoval!
Formulár verejnej triedy1. Zdedí systém. Windows. Formy. Formulár. #Region „Kód vygenerovaný programom Windows Form Designer“ Dim LabelArray (4) Ako štítok. „vyhlásiť rad štítkov. Súkromný pod Form1_Load (_. ByVal odosielateľ ako systém. Objekt, _. ByVal e As System. EventArgs) _. Rukoväte MyBase. Naložiť. SetControlArray () End Sub. Sub SetControlArray () LabelArray (1) = Label1. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. End Sub. Private Sub Button1_Click (_. ByVal odosielateľ ako systém. Objekt, _. ByVal e As System. EventArgs) _. Rukoväte Button1.Click. „Tlačidlo 1 Vymazať pole. Dim a In Inger. Pre a = 1 až 4. LabelArray (a) .Text = "" Ďalšie. End Sub. Private Sub Button2_Click (_. ByVal odosielateľ ako systém. Objekt, _. ByVal e As System. EventArgs) _. Rukoväte Button2.Click. 'Button 2 Fill Array. Dim a In Inger. Pre a = 1 až 4. LabelArray (a) .Text = _. „Control Array“ a CStr (a) Ďalšie. End Sub. Koncová trieda
Ak experimentujete s týmto kódom, zistíte, že okrem nastavenia vlastností štítkov môžete volať aj metódy. Prečo som teda (a Microsoft) urobil všetky ťažkosti pri zostavovaní kódu „Ugly“ v časti I článku?
Musím nesúhlasiť s tým, že v klasickom zmysle VB je to skutočne „kontrolné pole“. Riadiace pole VB 6 je podporovanou súčasťou syntaxe VB 6, nielen technikou. V skutočnosti je možné, že tento príklad opíšeme tak, že ide o rad ovládacích prvkov, nie o kontrolné pole.
V časti I som sa sťažoval, že príklad spoločnosti Microsoft fungoval IBA v čase vykonávania a nie v čase návrhu. Môžete pridávať a mazať ovládacie prvky z formulára dynamicky, ale celá vec musí byť implementovaná v kóde. Ovládacie prvky nie je možné presunúť myšou myšou, a vytvoríte ich tak, ako môžete vo VB 6. Tento príklad funguje hlavne v čase návrhu a nie v čase vykonávania. V čase vykonávania nie je možné dynamicky pridávať ani odstraňovať ovládacie prvky. Svojím spôsobom je to úplne opačný príklad ako v časti I.
Príklad klasického riadiaceho poľa VB 6 je ten istý, ktorý je implementovaný v kóde VB .NET. Tu v kóde VB 6 (je prevzatý od spoločnosti Mezick & Hillier, Sprievodca certifikačnou skúškou jazyka Visual Basic 6, str. 206 - mierne upravený, pretože príklad v knihe vedie k ovládacím prvkom, ktoré nemožno vidieť):
Dim MyTextBox ako VB.TextBox. Statické číslo ako celé číslo. intNumber = intNumber + 1. Nastaviť MyTextBox = _. Me. Controls. Pridať („VB.TextBox“, _. „Text“ a číslo int) MyTextBox. Text = MyTextBox. Názov. MyTextBox. Viditeľné = Pravda. MyTextBox. Vľavo = _. (intNumber - 1) * 1200
Ale ako sa spoločnosť Microsoft (a ja) zhodneme, riadiace polia VB 6 nie sú vo VB.NET možné. To najlepšie, čo môžete urobiť, je duplikovať funkčnosť. Môj článok zdvojnásobil funkčnosť nájdenú v príklade Mezick & Hillier. Kód študijnej skupiny duplikuje funkčnosť možnosti nastavenia vlastností a metód volania.
Záverom teda je, že naozaj záleží na tom, čo chcete robiť. VB.NET nemá celú vec zabalenú ako súčasť jazyka - Napriek tomu - ale nakoniec je oveľa flexibilnejšia.
Prevziať kontrolné polia od Johna Fannona
John napísal: Potreboval som kontrolné polia, pretože som chcel v čase spustenia dať do formulára jednoduchú tabuľku čísel. Nechcel som nevoľnosť ich umiestnenia jednotlivo a chcel som použiť VB.NET. Spoločnosť Microsoft ponúka veľmi podrobné riešenie jednoduchého problému, ale je to veľmi veľké kladivo na rozlúsknutie veľmi malej matice. Po nejakom experimentovaní som nakoniec našiel riešenie. Takto som to urobil.
Vyššie uvedený príklad About Visual Basic ukazuje, ako môžete vytvoriť textový blok vo formulári vytvorením inštancie objektu, nastavenie vlastností a jeho pridanie do kolekcie Kontroly, ktorá je súčasťou formulára objekt.
Dim txtDataShow as New TextBox
txtDataShow. Výška = 19
txtDataShow. Šírka = 80
txtDataShow. Poloha = Nový bod (X, Y)
Me. Controls. Pridať (txtDataShow)
Aj keď riešenie spoločnosti Microsoft vytvára triedu, zdôvodnil som, že by bolo možné namiesto toho všetko zabaliť do podprogramu. Zakaždým, keď zavoláte túto podprogram, vytvoríte vo formulári novú inštanciu textového poľa. Tu je kompletný kód:
Formulár verejnej triedy1
Zdedí systém. Windows. Formy. formulár
#Region „Kód vygenerovaný programom Windows Form Designer“
Súkromná sub BtnStart_Click (_
ByVal odosielateľ ako systém. Objekt, _
ByVal e As System. EventArgs) _
Rukoväte btnStart. cvaknutie
Dim I ako celé číslo
Dim sData ako reťazec
Pre I = 1 až 5
sData = CStr (I)
Zavolajte na AddDataShow (sData, I)
Ďalšie
End Sub
Sub AddDataShow (_
ByVal sText As String, _
ByVal I ako celé číslo)
Dim txtDataShow as New TextBox
Dim UserLft, UserTop As Integer
Dim X, Y ako celé číslo
UserLft = 20
UserTop = 20
txtDataShow. Výška = 19
txtDataShow. Šírka = 25
txtDataShow. TextAlign = _
HorizontalAlignment. centrum
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Text = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. výška
txtDataShow. Poloha = Nový bod (X, Y)
Me. Controls. Pridať (txtDataShow)
End Sub
Koncová trieda
Veľmi dobrá vec, John. Je to určite oveľa jednoduchšie ako kód spoločnosti Microsoft... tak sa čudujem, prečo tak trvali na tom?
Ak chcete začať s vyšetrovaním, skúste zmeniť jeden z priradení majetku v kóde. Poďme sa zmeniť
txtDataShow. Výška = 19
na
txtDataShow. Výška = 100
len aby sme sa ubezpečili, že existujú výrazné rozdiely.
Keď znova spustíme kód, dostaneme... Whaaaat??? ... to isté. Žiadna zmena vôbec. V skutočnosti môžete hodnotu zobraziť pomocou príkazu ako MsgBox (txtDataShow). Výška) a stále dostanete 20 ako hodnotu nehnuteľnosti bez ohľadu na to, čo ste jej priradili. Prečo sa to stalo?
Odpoveď je, že neodvodzujeme vlastnú triedu na vytváranie objektov, iba pridávame veci do inej triedy, takže sa musíme riadiť pravidlami inej triedy. A tieto pravidlá hovoria, že nemôžete zmeniť vlastnosť Výška. (Wellllll... môžeš. Ak zmeníte vlastnosť Multiline na hodnotu True, môžete zmeniť výšku.)
Prečo VB.NET ide ďalej a vykonáva kód bez rozmaru, že by sa mohlo vyskytnúť niečo zlé, keď v skutočnosti úplne ignoruje vaše tvrdenie. Mohol by som však navrhnúť aspoň varovanie v kompilácii. (Tip! Tip! Tip! Počúva Microsoft?)
Príklad z časti I zdedí od inej triedy, čo sprístupní vlastnosti kódu v dedičnej triede. Zmena vlastnosti Height na 100 v tomto príklade nám poskytne očakávané výsledky. (Opäť... jedno vylúčenie zodpovednosti: Keď sa vytvorí nová inštancia veľkej súčasti štítka, zakrýva starú. Ak chcete skutočne vidieť nové komponenty štítka, musíte pridať volanie metódy aLabel. BringToFront ().)
Tento jednoduchý príklad ukazuje, že hoci môžeme jednoducho pridávať objekty do inej triedy (a niekedy je to správne), programovanie ovládania objektov vyžaduje, aby sme ich odvodili triedou a najorganizovanejším spôsobom (trúfam si povedať, ".NET cesta"?) je vytvoriť vlastnosti a metódy v novej odvodenej triede, ktorá sa má zmeniť veci. John zostal spočiatku nepresvedčený. Povedal, že jeho nový prístup vyhovuje jeho účelu, aj keď existujú obmedzenia z toho, že nie je „COO“ (správne zamerané na objekt). Nedávno však John napísal,
"... Po napísaní sady 5 textových polí za behu som chcel aktualizovať údaje v následnej časti programu - ale nič sa nezmenilo - pôvodné údaje tam stále boli.
Zistil som, že problém dokážem vyriešiť napísaním kódu, ktorý vyzradí staré škatule a vráti ich späť s novými údajmi. Lepším spôsobom, ako to dosiahnuť, by bolo použitie mňa. Obnoviť. Tento problém ma však upozornil na potrebu poskytnúť metódu na odpočítanie a doplnenie textových polí. “
Johnov kód použil globálnu premennú na sledovanie toho, koľko ovládacích prvkov bolo do formulára pridané, takže metóda ...
Súkromný podformulár1_Load (_
ByVal odosielateľ ako systém. Objekt, _
ByVal e As System. EventArgs) _
Rukoväte MyBase. Naložiť
CntlCnt0 = Me. Controls. počítať
End Sub
Potom mohla byť odstránená posledná kontrola ...
N = Me. Controls. Počet - 1
Me. Controls. RemoveAt (N)
John poznamenal, že „možno je to trochu nemotorné.“
Je to spôsob, akým spoločnosť Microsoft sleduje objekty v COM A v ich „škaredom“ príklade vyššie.
Teraz som sa vrátil k problému dynamického vytvárania ovládacích prvkov vo formulári v čase vykonávania a znova som sa pozeral na články „Čo sa stalo s kontrolnými poľami“.
Vytvoril som triedy a teraz môžem umiestniť ovládacie prvky do formulára tak, ako by som chcel.
John demonštroval, ako kontrolovať umiestnenie ovládacích prvkov do skupinovej schránky pomocou nových tried, ktoré začal používať. Možno, že spoločnosť Microsoft mala koniec koncov pravdu v ich „škaredom“ riešení!