Propuštanje kontrolnih nizova iz VB.NET-a izazov je za one koji podučavaju o nizovima.
- Više nije moguće jednostavno kopirati kontrolu, kao što je tekstni okvir, i zalijepiti je (jednom ili nekoliko puta) da biste stvorili kontrolni niz.
- VB.NET kod za stvaranje strukture slične kontrolnom polju bio je u svim knjigama na VB.NET-u koje sam kupio i putem interneta mnogo duži i složeniji. Nedostaje mu jednostavnost kodiranja kontrolnog niza koji se nalazi u VB6.
Ako referencirate na biblioteku kompatibilnosti VB6, tamo se nalaze objekti koji djeluju slično kao kontrolni nizovi. Da biste vidjeli što mislim, jednostavno koristite čarobnjaka za nadogradnju VB.NET s programom koji sadrži kontrolni niz. Kôd je opet ružan, ali djeluje. Loša vijest je da Microsoft neće jamčiti da će komponente kompatibilnosti i dalje biti podržane, a vi ih ne biste trebali koristiti.
VB.NET kod za stvaranje i korištenje "kontrolnih nizova" je mnogo dulji i složeniji.
Prema Microsoftu, napraviti nešto što je blizu onoga što možete učiniti u VB 6 zahtijeva stvaranje "jednostavne komponente koja duplicira funkcionalnost kontrolnog niza".
Za ilustraciju vam trebaju i nova klasa i obrazac za hosting. Klasa zapravo stvara i uništava nove naljepnice. Kompletan kôd klase je kako slijedi:
Javna klasa LabelArray
Nasljedni sustav. Zbirke. CollectionBase
Privatni oblik za čitanje samo kao domaćin _
Sustav. Windows. Obrasci. Oblik
Javna funkcija AddNewLabel () _
Kao sustav. Windows. Obrasci. Označiti
'Napravite novu instancu klase Label.
Dim aLabel Kao novi sustav. Windows. Obrasci. Označiti
'Dodajte oznaku u kolekcije
'interni popis.
Mi. Popis. Dodaj (aLabel)
Dodajte oznaku u kolekciju Kontrole
'obrasca na koji se odnosi polje HostForm.
HostForm. Kontrole. Dodaj (aLabel)
'Odredite svojstvena svojstva za objekt Label.
aLabel. Vrh = broj * 25
aLabel. Širina = 50
aLabel. Lijevo = 140
aLabel. Oznaka = ja. Računati
aLabel. Text = "Oznaka" & Ja. Računati. ToString
Vrati oznaku
Završna funkcija
Javno pod-novo (_
ByVal domaćin kao sustav. Windows. Obrasci. Oblik)
HostForm = domaćin
Mi. AddNewLabel ()
Kraj Sub
Zadani javni ReadOnly entitet _
Stavka (ByVal indeks kao cijeli broj) Kao _
Sustav. Windows. Obrasci. Označiti
Dobiti
Vrati CType (Me. Popis. Stavka (indeks), _
Sustav. Windows. Obrasci. Označiti)
Kraj Get
Kraj imovine
Javno pod uklanjanje ()
"Provjerite ima li naljepnica koju treba ukloniti.
Da sam ja. Broj> 0 Zatim
'Uklonite zadnju naljepnicu dodanu u niz
'iz zbirke kontrolnika obrasca domaćina.
'Imajte na umu upotrebu zadanog svojstva u
'pristup nizu.
HostForm. Kontrole. Ukloni (Ja (broj mene - 1))
Mi. Popis. RemoveAt (broj mene - 1)
Završi ako
Kraj Sub
Krajnja klasa
Da biste ilustrirali kako će se kôd ove klase koristiti, mogli biste stvoriti obrazac koji ga poziva. Morate koristiti kôd prikazan dolje u obrascu:
Oblik javne klase1. Nasljedni sustav. Windows. Obrasci. Oblik. #Region "Kôd generiran od Windows Designera" 'Također morate dodati izjavu:' MyControlArray = Novi LabelArray (Ja) 'nakon poziva InitializeComponent () u. 'skriveni kôd regije. 'Deklariranje novog objekta ButtonArray. Dim MyControlArray Kao LabelArray. Privatni Sub btnLabelAdd_Click (_. ByVal pošiljalac kao sustav. Objekt, _. ByVal e kao sustav. EventArgs) _. Ručke btnLabelAdd. Klik. 'Nazovite metodu AddNewLabel. 'MyControlArray. MyControlArray. AddNewLabel () 'Promijenite svojstvo BackColor. 'gumba 0. MyControlArray (0) .BackColor = _. Sustav. Crtanje. Boja. Crvena. Kraj Sub. Privatni Sub btnLabelRemove_Click (_. ByVal pošiljalac kao sustav. Objekt, _. ByVal e kao sustav. EventArgs) _. Ručke btnLabelRemove. Klik. 'Nazovite metodu Ukloni MyControlArray. MyControlArray. Ukloniti() Kraj Sub. Krajnja klasa
Prvo, to uopće ne radi posao u vrijeme dizajna kao što smo to radili u VB 6! I drugo, oni nisu u nizu, oni su u VB.NET zbirci - puno drugačija stvar od niza.
Razlog zbog kojeg VB.NET ne podržava VB 6 "kontrolni niz" je taj što ne postoji takva "kontrolna matrica" (imajte na umu promjenu navodnika). VB 6 stvara kolekciju u pozadini i čini se da je to niz podataka programeru. Ali to nije niz i nad njim imate malu kontrolu nad funkcijama koje pružaju IDE.
VB.NET, s druge strane, naziva to što jest: zbirka objekata. I ključeve kraljevstva predaju programeru stvarajući cijelu stvar na otvorenom.
Kao primjer vrsta prednosti koje daje programeru, u VB 6 kontrole moraju biti istog tipa i morale su imati isto ime. Budući da su to samo objekti u VB.NET-u, možete ih praviti različitim vrstama i davati im različita imena te ih i dalje upravljati u istoj kolekciji objekata.
U ovom primjeru, isti klik događaja upravlja s dva gumba i potvrdnim okvirom i prikazuje na koji je kliknut. Učinite to u jednom retku koda s VB 6!
Privatni podmješani kontrolni_klici (_
ByVal pošiljalac kao sustav. Objekt, _
ByVal e kao sustav. EventArgs) _
Ručke Tipka1.Kliknite, _
Gumb2.Click, _
CheckBox1.Click
'Izjava u nastavku mora biti jedna duga izjava!
"Ovdje se nalazi u četiri retka kako bi bilo usko
'dovoljno da stane na web stranicu
Oznaka2.Text =
Microsoft. Visual Basic. Ispravno (pošiljalac). GetType. ToString,
Len (pošiljalac). GetType. ToString) -
(InStr (pošiljatelj). GetType. ToString, "Obrasci") + 5))
Kraj Sub
Proračun podstrane je nekako složen, ali zapravo nije ono o čemu mi ovdje govorimo. U slučaju Click možete učiniti bilo što. Na primjer, možete upotrijebiti vrstu kontrole u izrazu If za obavljanje različitih stvari za različite kontrole.
Frankova povratna informacija o nizovima Frank-evih studija računalstva
Frank's Study Group dao je primjer obrasca koji ima 4 naljepnice i 2 gumba. Gumb 1 uklanja naljepnice, a gumb 2 ih ispunjava. Dobra je ideja ponovno pročitati Frankovo prvobitno pitanje i primijetiti da je primjer koji on koristi bio petlja koja se koristi za brisanje svojstva Caption od niza komponenti Label. Evo VB.NET ekvivalenta VB 6 koda. Ova šifra čini ono što je Frank prvotno tražio!
Oblik javne klase1. Nasljedni sustav. Windows. Obrasci. Oblik. #Region "Kôd generiran od Windows Designera" Dim LabelArray (4) Kao oznaka. 'proglasi niz naljepnica. Private Sub Form1_Load (_. ByVal pošiljalac kao sustav. Objekt, _. ByVal e kao sustav. EventArgs) _. Rukuje MyBase. Opterećenje. SetControlArray () Kraj Sub. Pod SetControlArray () LabelArray (1) = Label1. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. Kraj Sub. Privatni potpuni gumb1_Click (_. ByVal pošiljalac kao sustav. Objekt, _. ByVal e kao sustav. EventArgs) _. Ručke gumba1.Kliknite. 'Gumb 1 Očisti niz. Dim a kao cjelobrojni. Za a = 1 do 4. LabelArray (a) .Text = "" Sljedeći. Kraj Sub. Privatni potprostor2_Click (_. ByVal pošiljalac kao sustav. Objekt, _. ByVal e kao sustav. EventArgs) _. Ručke gumba2.Kliknite. 'Gumb 2 Ispunite niz. Dim a kao cjelobrojni. Za a = 1 do 4. LabelArray (a) .Text = _. "Upravljački niz" i CStr (a) Sljedeći. Kraj Sub. Krajnja klasa
Ako eksperimentirate s ovim kodom, otkrit ćete da osim postavljanja svojstava Oznake možete pozivati i metode. Pa zašto sam (i Microsoft) krenuo u sve probleme kako bih izradio "ružni" kod u prvom dijelu članka?
Moram se složiti da je to stvarno „Control Array“ u klasičnom VB smislu. VB 6 Control Array je podržani dio VB 6 sintakse, a ne samo tehnika. Zapravo, možda je način da se ovaj primjer opiše taj da je to niz kontrola, a ne Control Array.
U prvom dijelu žalio sam se da je Microsoftov primjer SAMO radio u vrijeme izvođenja, a ne vrijeme dizajniranja. Možete dodavati i brisati kontrole iz obrasca dinamički, ali cijela se stvar mora implementirati u kod. Ne možete povući i ispustiti kontrole kako biste ih stvorili onako kako možete u VB 6. Ovaj primjer djeluje uglavnom u vrijeme dizajniranja, a ne u vrijeme izvođenja. Kontrole ne možete dinamički dodavati i brisati u vrijeme izvođenja. Na neki način to je potpuna suprotnost primjeru I. dijela.
Primjer klasičnog VB 6 upravljačkog polja je isti onaj koji je implementiran u VB .NET kod. Ovdje u VB 6 kodu (preuzet je iz Mezick & Hillier, Vodič za ispitni pregled za Visual Basic 6, str. 206 - malo izmijenjeno, budući da primjer knjige sadrži kontrole koje se ne mogu vidjeti):
Dim MyTextBox kao VB.TextBox. Statički intNumber kao Integer. intNumber = intNumber + 1. Postavite MyTextBox = _. Mi. Kontrole. Dodaj ("VB.TextBox", _. "Tekst" i intNumber) MyTextBox. Tekst = MyTextBox. Ime. MyTextBox. Vidljivo = Istina. MyTextBox. Lijevo = _. (intNumber - 1) * 1200
No kako se Microsoft (i ja) slažemo, kontrolni niz VB 6 nije moguć u VB.NET-u. Dakle, najbolje što možete učiniti je duplicirati funkcionalnost. Moj je članak duplicirao funkcionalnost koja se nalazi u primjeru Mezick & Hillier. Kôd Study Group duplicira funkcionalnost mogućnosti postavljanja svojstava i metoda poziva.
Stoga, zaključak je da zapravo ovisi o tome što želite raditi. VB.NET nema čitavu stvar koja je prekrivena dijelom jezika - ipak - ali u konačnici je daleko fleksibilnija.
John Fannon preuzmi kontrolne armature
John je napisao: Trebali su mi kontrolni nizovi jer sam želio staviti jednostavnu tablicu brojeva na obrazac u vrijeme izvođenja. Nisam želio mučninu postavljanja svih pojedinačno i želio sam koristiti VB.NET. Microsoft nudi vrlo detaljno rješenje jednostavnog problema, ali to je vrlo veliki malj za razbijanje vrlo male matice. Nakon nekog eksperimentiranja, konačno sam našao rješenje. Evo kako sam to učinio.
Gornji primjer About Visual Basic pokazuje kako možete stvoriti TextBox na obrascu stvaranjem instancije objekta, postavljanje svojstava i dodavanje u kolekciju Controls koja je dio Obrasca objekt.
Dim txtDataShow Kao novi TextBox
txtDataShow. Visina = 19
txtDataShow. Širina = 80
txtDataShow. Lokacija = nova točka (X, Y)
Mi. Kontrole. Dodaj (txtDataShow)
Iako Microsoftovo rješenje stvara klasu, zaključio sam da bi bilo moguće sve to zamotati u podprogram. Svaki put kada pozovete ovu podprogramu stvorite novu instancu textbox-a na obrascu. Evo potpunog koda:
Oblik javne klase1
Nasljedni sustav. Windows. Obrasci. Oblik
#Region "Kôd generiran od Windows Designera"
Privatni Sub BtnStart_Click (_
ByVal pošiljalac kao sustav. Objekt, _
ByVal e kao sustav. EventArgs) _
Rukuje btnStart. Klik
Dim sam kao cjelovit
Dim sData kao string
Za I = 1 do 5
sData = CStr (I)
Nazovite AddDataShow (sData, I)
Sljedeći
Kraj Sub
Sub AddDataShow (_
ByVal sText Kao niz, _
ByVal I kao cjelovit korisnik)
Dim txtDataShow Kao novi TextBox
Dim UserLft, UserTop kao Integer
Dim X, Y kao cjelobrojni
UserLft = 20
UserTop = 20
txtDataShow. Visina = 19
txtDataShow. Širina = 25
txtDataShow. TextAlign = _
Horizontalno. Centar
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Tekst = sText
X = KorisnikLft
Y = UserTop + (I - 1) * txtDataShow. Visina
txtDataShow. Lokacija = nova točka (X, Y)
Mi. Kontrole. Dodaj (txtDataShow)
Kraj Sub
Krajnja klasa
Jako dobro, John. Ovo je sigurno puno jednostavnije od Microsoftovog koda... pa se pitam zašto su inzistirali da to učine na taj način?
Za početak naše istrage, pokušajmo promijeniti jedan od svojstava svojstava u kodu. Promijenimo
txtDataShow. Visina = 19
do
txtDataShow. Visina = 100
samo da se uvjerim da postoji primjetna razlika.
Kad ponovo pokrenemo kod, dobit ćemo... Whaaaat??? ... ista stvar. Nema promjene uopće. U stvari, vrijednost možete prikazati izjavom poput MsgBox (txtDataShow). Visina) i još uvijek dobijete 20 kao vrijednost nekretnine bez obzira na to što joj dodijelite. Zašto se to događa?
Odgovor je da ne stvaramo vlastitu Klasu za stvaranje predmeta, samo dodajemo stvari drugoj klasi, tako da moramo slijediti pravila druge klase. A ta pravila kažu da ne možete promijeniti svojstvo Height. (Wellllll... možeš. Ako promijenite svojstvo Multiline u True, tada možete promijeniti visinu.)
Zašto VB.NET ide naprijed i izvršava kôd bez ikakvog šaptanja da možda nešto nije u redu kad, u stvari, potpuno zanemaruje vašu izjavu, to je sasvim drugo. Ipak bih mogao predložiti barem upozorenje. (Savjet! Savjet! Savjet! Sluša li Microsoft?)
Primjer iz dijela I nasljeđuje iz druge klase, a to omogućuje svojstva dostupna kodu u nasljeđujućoj klasi. Promjena svojstva Height u 100 u ovom primjeru daje nam očekivane rezultate. (Opet... jedan odricanje od odgovornosti: Kada se stvori nova instanca velike komponente Label, ona prikriva staru. Da biste zapravo vidjeli nove komponente oznake, morate dodati metodu poziva aLabel. Donijeti naprijed().)
Ovaj jednostavan primjer pokazuje da, iako MOŽEMO jednostavno dodati objekte u drugu klasu (a to je ponekad ispravno), programiranje kontrole nad objektima zahtijeva da ih izvodimo u Klasi i na najorganizovaniji način (usudim se reći, ".NET način" ??) je stvaranje novih svojstava i metoda u novoj izvedenoj Klasi za promjenu stvari. John je u početku ostao neuvjerljiv. Rekao je da njegov novi pristup odgovara njegovoj svrsi iako postoje ograničenja od toga da ne bude "COO" (točno usmjereno prema objektima). U novije vrijeme, međutim, John je napisao,
"... nakon što sam napisao set od 5 okvira za tekst tijekom izvođenja, želio sam ažurirati podatke u sljedećem dijelu programa - ali ništa se nije promijenilo - izvorni podaci su još uvijek bili tu.
Otkrio sam da mogu riješiti problem pisanjem koda kako bih skinuo stare kutije i ponovno ih vratio s novim podacima. Bolji način da to učinite bilo bi korištenje Mene. Osvježiti. No ovaj je problem privukao moju pažnju zbog potrebe pružanja metode oduzimanja tekstnih okvira kao i njihovog dodavanja. "
Ivanov kôd koristio je globalnu varijablu za praćenje koliko kontrola je dodano u obrazac tako da se metoda ...
Private Sub Form1_Load (_
ByVal pošiljalac kao sustav. Objekt, _
ByVal e kao sustav. EventArgs) _
Rukuje MyBase. Opterećenje
CntlCnt0 = Ja. Kontrole. Računati
Kraj Sub
Tada je "posljednja" kontrola mogla biti uklonjena ...
N = Ja. Kontrole. Broj - 1
Mi. Kontrole. RemoveAt (N)
John je napomenuo da je, "možda je ovo pomalo nespretno".
To je način na koji Microsoft vodi evidenciju objekata u COM AND-u gore navedenom "ružnom" primjeru.
Sada sam se vratio problemu dinamičkog stvaranja kontrola na obrascu u vrijeme izvođenja i ponovno sam pogledao članke „Što se dogodilo s kontrolnim nizovima“.
Ja sam stvorio klase i sada mogu staviti kontrole u obrazac na način na koji želim da budu.
John je pokazao kako kontrolirati položaj kontrola u grupnom okviru koristeći nove klase koje je počeo koristiti. Možda je Microsoft ipak imao pravo na njihovo „ružno“ rješenje!