VB.NET: Mitä tapahtui ohjausryhmiin

Ohjausryhmien jättäminen pois VB.NET: stä on haaste niille, jotka opettavat taulukkoja.

  • Ei ole enää mahdollista yksinkertaisesti kopioida ohjainta, kuten tekstikenttää, ja liittää sitten se (kerran tai useita kertoja) luodaksesi ohjausryhmän.
  • VB.NET-koodi ohjausryhmän kaltaisen rakenteen luomiseksi on ollut kaikissa VB.NET: n ostamissa ja verkossa olevissa VB.NET-kirjoissa paljon pidempi ja paljon monimutkaisempi. Siltä puuttuu VB6: sta löytyvän ohjausryhmän koodaus.

Jos viitat VB6-yhteensopivuuskirjastoon, siellä on objekteja, jotka toimivat melko paljon kuin ohjausryhmät. Katso mitä tarkoitan, käytä ohjattua VB.NET-päivitystoimintoa ohjelman kanssa, joka sisältää ohjausryhmän. Koodi on taas ruma, mutta se toimii. Huono uutinen on, että Microsoft ei takaa, että yhteensopivuuskomponentteja tuetaan edelleen, eikä sinun pitäisi käyttää niitä.

VB.NET-koodi "ohjausryhmien" luomiseen ja käyttöön on paljon pidempi ja monimutkaisempi.

Microsoftin mukaan jotakin tekemistä jopa lähellä sitä, mitä voit tehdä VB 6: ssa, on luotava "yksinkertainen komponentti, joka kopioi ohjausryhmän toiminnot".

instagram viewer

Tarvitset sekä uuden luokan että hosting-lomakkeen tämän havainnollistamiseksi. Luokka todella luo ja tuhoaa uusia tarroja. Koko luokan koodi on seuraava:

Julkisen luokan LabelArray
Perii järjestelmä. Kokoelmia. CollectionBase
Yksityinen luku vain HostForm As _
Järjestelmä. Windows. Lomakkeet. muoto
Julkinen toiminto AddNewLabel () _
Järjestelmänä. Windows. Lomakkeet. etiketti
'Luo uusi esiintymä Label-luokasta.
Dim aLabel kuin uusi järjestelmä. Windows. Lomakkeet. etiketti
'Lisää etiketti kokoelmaan
'sisäinen luettelo.
Minä. Lista. Lisää (aLabel)
'Lisää tarra säätimet-kokoelmaan
”lomakasta, johon HostForm-kenttä viittaa.
HostForm. Valvontaa. Lisää (aLabel)
'Aseta tarraobjektin alkuperäiset ominaisuudet.
Alabel. Ylä = Count * 25
Alabel. Leveys = 50
Alabel. Vasen = 140
Alabel. Tag = Me. Kreivi
Alabel. Teksti = "Label" & Me. Kreivi. toString
Palauta aLabel
Lopeta toiminto
Julkinen osa Uusi (_
ByVal-isäntänä järjestelmänä. Windows. Lomakkeet. lomake)
HostForm = isäntä
Minä. AddNewLabel ()
End Sub
Oletuksena julkinen vain luettavissa oleva omaisuus _
Tuote (ByVal-indeksi kokonaislukuna) Kuten _
Järjestelmä. Windows. Lomakkeet. etiketti
Saada
Palauta CType (Me. Lista. Tuote (hakemisto), _
Järjestelmä. Windows. Lomakkeet. Label)
End Get
Lopeta omaisuus
Julkinen osa Poista ()
'Varmista, että poistettava etiketti on.
Jos minä. Laske> 0 Sitten
'Poista viimeinen taulukkoon lisätty tarra
'isäntälomakkeella ohjaa kokoelmaa.
'Huomaa oletusominaisuuden käyttö
'pääsy taulukkoon.
HostForm. Valvontaa. Poista (minä (Me. Count - 1))
Minä. Lista. PoistaAt (Me. Count - 1)
Loppu Jos
End Sub
Loppu luokka

Voit havainnollistaa, kuinka tätä luokkakoodia käytetään, luomalla lomake, joka kutsuu sitä. Sinun olisi käytettävä alla olevaa lomaketta muodossa:

Julkisen luokan lomake1. Perii järjestelmä. Windows. Lomakkeet. Muodostavat. #Region "Windows Form Designerin luoma koodi" 'Lisäksi sinun on lisättävä lause:' MyControlArray = New LabelArray (Me) 'Initialize Component () - puhelun jälkeen. 'piilotettu aluekoodi. 'Julkaise uusi ButtonArray-objekti. Dim MyControlArray nimellä LabelArray. Yksityinen Sub btnLabelAdd_Click (_. ByVal-lähettäjä järjestelmänä. Kohde, _. ByVal e As -järjestelmä. EventArgs) _. Käsittelee btnLabelAdd. Klikkaus. 'Soita AddNewLabel-menetelmälle. MyControlArray. MyControlArray. AddNewLabel () 'Muuta BackColor-ominaisuutta. '-painikkeesta 0. MyControlArray (0) .BackColor = _. Järjestelmä. Piirustus. Väri. Punainen. End Sub. Yksityinen Sub btnLabelRemove_Click (_. ByVal-lähettäjä järjestelmänä. Kohde, _. ByVal e As -järjestelmä. EventArgs) _. Käsittelee btnLabelRemove. Klikkaus. 'Soita MyControlArray Poista-menetelmälle. MyControlArray. Poista() End Sub. Loppu luokka

Ensinnäkin, tämä ei edes tee työtä Design Time -palvelussa kuten aiemmin teimme VB 6: ssa! Ja toiseksi, ne eivät ole ryhmässä, ne ovat VB.NET-kokoelmassa - paljon eri asia kuin taulukko.

Syynä siihen, että VB.NET ei tue VB 6: n "ohjausryhmää", on se, että ei ole sellaista asiaa kuin "ohjaus" "taulukko" (huom. Lainausmerkkien muutos). VB 6 luo kokoelman kulissien takana ja saa sen näkymään taulukkona kehittäjälle. Mutta se ei ole taulukko, ja sinulla on vain vähän hallintaa sen ulkopuolella IDE: n tarjoamien toimintojen lisäksi.

VB.NET puolestaan ​​kutsuu sitä mitä se on: kokoelma esineitä. Ja he luovuttavat valtakunnan avaimet kehittäjälle luomalla koko asian heti ulkona.

Esimerkkinä sellaisista eduista, jotka tämä antaa kehittäjälle, VB 6: ssa säätimien piti olla samantyyppisiä ja niillä oli oltava sama nimi. Koska nämä ovat vain VB.NET: n objekteja, voit tehdä niistä erityyppisiä ja antaa niille erilaisia ​​nimiä ja hallita niitä samalla objektikokoelmassa.

Tässä esimerkissä sama napsautustapahtuma käsittelee kaksi painiketta ja valintaruutua ja näyttää, kumpaa napsautettiin. Tee se yhdessä koodirivissä VB 6: n kanssa!

Yksityinen Sub MixedControls_Click (_
ByVal-lähettäjä järjestelmänä. Kohde, _
ByVal e As -järjestelmä. EventArgs) _
Kahvat Button1.Click, _
Painike2.Klikkaa, _
CheckBox1.Click
'Alla olevan lausuman on oltava yksi pitkä lausunto!
'Se on täällä neljällä rivillä pitääkseen sen kapeana
'tarpeeksi, jotta mahtuu verkkosivulle
Label2.Text =
Microsoft. VisualBasic. Oikein (lähettäjä. GetType. toString,
Len (lähettäjä. GetType. ToString) -
(InStr (lähettäjä. GetType. ToString, "Lomakkeet") + 5))
End Sub

Substring-laskelma on eräänlainen monimutkainen, mutta se ei oikeastaan ​​ole mitä me täällä puhumme. Voit tehdä mitä tahansa Click-tapahtumassa. Voit esimerkiksi käyttää ohjaustyyppiä If-käskyssä tehdä erilaisia ​​asioita eri säätimille.

Frankin tietojenkäsittelytutkimusryhmän palaute ryhmistä

Frankin tutkimusryhmä tarjosi esimerkin lomakkeesta, jossa on 4 tarraa ja 2 nappia. Painike 1 tyhjentää tarrat ja painike 2 täyttää ne. On hyvä idea lukea uudelleen Frankin alkuperäinen kysymys ja huomata, että hänen käyttämänsä esimerkki oli silmukka, jota käytetään Label-komponenttien joukon Caption-ominaisuuden tyhjentämiseen. Tässä on kyseisen VB 6 -koodin VB.NET-vastine. Tämä koodi tekee sen, mitä Frank alun perin pyysi!

Julkisen luokan lomake1. Perii järjestelmä. Windows. Lomakkeet. Muodostavat. #Region "Windows Form Designerin luoma koodi" Dim LabelArray (4) nimellä Label. 'ilmoittaa joukko etikettejä. Yksityinen alamuoto1_lataus (_. ByVal-lähettäjä järjestelmänä. Kohde, _. ByVal e As -järjestelmä. EventArgs) _. Käsittelee MyBasea. Ladata. SetControlArray () End Sub. Sub SetControlArray () LabelArray (1) = Label1. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. End Sub. Yksityinen alapainike1_ napsauta (_. ByVal-lähettäjä järjestelmänä. Kohde, _. ByVal e As -järjestelmä. EventArgs) _. Kahvat Button1.Click. 'Painike 1 Poista ryhmä. Himmennä kokonaislukuna. Jos a = 1 - 4. LabelArray (a) .Text = "" Seuraava. End Sub. Yksityinen alapainike2_ Napsauta (_. ByVal-lähettäjä järjestelmänä. Kohde, _. ByVal e As -järjestelmä. EventArgs) _. Kahvat Button2.Click. 'Painike 2 Täytä taulukko. Himmennä kokonaislukuna. Jos a = 1 - 4. LabelArray (a) .Text = _. "Ohjausryhmä" ja CStr (a) Seuraava. End Sub. Loppu luokka

Jos kokeilet tätä koodia, huomaat, että Tunnisteiden ominaisuuksien asettamisen lisäksi voit myös kutsua menetelmiä. Joten miksi minä (ja Microsoft) kärsin kaikista vaikeuksista rakentaa "ruma" -koodi artikkelin I osaan?

Minun on oltava eri mieltä siitä, että se on todella "Control Array" klassisessa VB-merkityksessä. VB 6 -ohjausryhmä on tuettu osa VB 6 -sintaksia, ei vain tekniikkaa. Itse asiassa ehkä tapa kuvata tätä esimerkkiä on, että se on ohjainryhmä, ei ohjausryhmä.

Osassa I valitin, että Microsoftin esimerkki toimi VAIN ajoaikana eikä suunnitteluaikana. Voit lisätä ja poistaa ohjauksia lomakkeesta dynaamisesti, mutta koko asia on toteutettava koodina. Et voi vetää ja pudottaa säätimiä luodaksesi niitä kuten VB 6: ssa. Tämä esimerkki toimii pääasiassa suunnitteluaikana, ei ajona. Et voi lisätä ja poistaa ohjaimia dynaamisesti ajon aikana. Tavallaan se on täysin vastakohta osan I esimerkille.

Klassinen VB 6 -ohjausryhmän esimerkki on sama, joka on toteutettu VB .NET-koodiin. Tässä VB 6 -koodissa (tämä on otettu Mezick & Hillieristä, Visual Basic 6 -sertifiointikokeen opas, s. 206 - hiukan muokattu, koska kirjan esimerkki johtaa säätimiin, joita ei voi nähdä):

Himmennä MyTextBox nimellä VB.TextBox. Staattinen intNumber kokonaislukuna. intNumber = intNumber + 1. Aseta MyTextBox = _. Minä. Valvontaa. Lisää ("VB.TextBox", _. "Teksti" & intNumero) MyTextBox. Teksti = MyTextBox. Nimi. MyTextBox. Näkyvä = totta. MyTextBox. Vasen = _. (intNumber - 1) * 1200

Mutta kuten Microsoft (ja minä) olemme samaa mieltä, VB 6 -ohjausryhmät eivät ole mahdollisia VB.NET: ssä. Joten paras mitä voit tehdä, on kopioida toiminnallisuus. Artikkelini kopioi Mezick & Hillier-esimerkistä löytyvät toiminnot. Opintoryhmän koodi kopioi ominaisuudet ja kutsumenetelmät.

Joten lopullinen asia on, että se todella riippuu siitä, mitä haluat tehdä. VB.NET: llä ei ole koko asiaa kääritty osaksi kieltä - Silti -, mutta viime kädessä se on paljon joustavampi.

John Fannonin Ohjausryhmät

John kirjoitti: Tarvitsin ohjausryhmiä, koska halusin laittaa lomakkeeseen yksinkertaisen numerotaulukon ajon aikana. En halunnut pahoinvointia sijoittamalla niitä kaikkia erikseen ja halusin käyttää VB.NET: ää. Microsoft tarjoaa erittäin yksityiskohtaisen ratkaisun yksinkertaiseen ongelmaan, mutta se on erittäin suuri iskuvasara murtaamaan hyvin pieni mutteri. Jonkin kokeilun jälkeen löysin lopulta ratkaisun. Näin tein sen.

Yllä oleva Tietoja Visual Basic -esimerkistä osoittaa, kuinka voit luoda tekstikenttään lomakkeelle luomalla ilmentymän Objektin määrittäminen, ominaisuuksien asettaminen ja lisääminen lomakkeeseen kuuluvaan Controls-kokoelmaan esine.

Himmentää txtDataShow uudena tekstikenttänä
txtDataShow. Korkeus = 19
txtDataShow. Leveys = 80
txtDataShow. Paikka = Uusi piste (X, Y)
Minä. Valvontaa. Lisää (txtDataShow)
Vaikka Microsoft-ratkaisu luo luokan, perustein, että kaiken tämän olisi mahdollista kääriä aliohjelmaan. Joka kerta kun soitat tähän aliohjelmaan, luot uuden ilmentymän lomakkeessa olevaan tekstikenttään. Tässä on täydellinen koodi:

Julkisen luokan lomake1
Perii järjestelmä. Windows. Lomakkeet. muoto

#Region "Windows Form Designerin luoma koodi"

Yksityinen Sub BtnStart_Click (_
ByVal-lähettäjä järjestelmänä. Kohde, _
ByVal e As -järjestelmä. EventArgs) _
Käsittelee btnStart. Klikkaus

Dim I Kuten kokonaisluku
Dim sData merkkijonona
Jolle I = 1-5
sData = CStr (I)
Soita AddDataShow (sData, I)
Seuraava
End Sub
Sub AddDataShow (_
ByVal sText merkkijonona, _
ByVal I kokonaislukuna)

Himmentää txtDataShow uudena tekstikenttänä
Dim UserLft, UserTop kuin kokonaisluku
Dim X, Y kuin kokonaisluku
UserLft = 20
UserTop = 20
txtDataShow. Korkeus = 19
txtDataShow. Leveys = 25
txtDataShow. TextAlign = _
Vaakasuora kohdistaminen. Keskusta
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Teksti = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. Korkeus
txtDataShow. Paikka = Uusi piste (X, Y)
Minä. Valvontaa. Lisää (txtDataShow)
End Sub
Loppu luokka
Erittäin hyvä kohta, John. Tämä on varmasti paljon yksinkertaisempaa kuin Microsoft-koodi... joten ihmettelen, miksi he vaativat tekemään sen tällä tavalla?

Aloita tutkimuksemme, yritämme muuttaa yhtä koodin ominaisuusmäärityksistä. Vaihdetaan

txtDataShow. Korkeus = 19
että

txtDataShow. Korkeus = 100
vain varmistaaksesi, että ero on huomattava.

Kun suoritamme koodin uudelleen, saamme... Whaaaat??? ... sama asia. Ei muutosta ollenkaan. Itse asiassa voit näyttää arvon lauseella, kuten MsgBox (txtDataShow. Korkeus) ja saat silti kiinteistön arvona 20 riippumatta siitä, minkä osoitat sille. Miksi niin tapahtuu?

Vastaus on, että emme johda omaa luokkaa objektien luomiseen, vaan lisäämme vain asioita toiseen luokkaan, joten meidän on noudatettava toisen luokan sääntöjä. Ja näiden sääntöjen mukaan et voi muuttaa Korkeus-ominaisuutta. (Wellllll... sinä pystyt. Jos muutat Multiline-ominaisuuden arvoksi True, voit muuttaa korkeuden.)

Miksi VB.NET menee eteenpäin ja suorittaa koodin edes hätäämättä, että siellä voi olla jotain vialla, kun se todella jättää huomioimatta lausunnosi, että se on kokonainen "nother ryöppy". Voisin kuitenkin ehdottaa ainakin varoitusta käännöksessä. (Vihje! Vihje! Vihje! Kuunteleeko Microsoft?)

Osa I esimerkki perii toiselta luokalta, ja tämä tekee ominaisuudet saataviksi koodilla, joka perii luokassa. Korkeusominaisuuden muuttaminen arvoon 100 tässä esimerkissä antaa meille odotetut tulokset. (Uudelleen... yksi vastuuvapauslauseke: Kun luodaan suuri esiintymä suuresta Label-komponentista, se peittää vanhan. Jotta todella näet uudet Label-komponentit, sinun on lisättävä menetelmäsoitto aLabel. Tuo eteen().)

Tämä yksinkertainen esimerkki osoittaa, että vaikka voimme yksinkertaisesti lisätä objekteja toiseen luokkaan (ja joskus tämä on oikein tehtävä), objektien ohjelmoinnin hallinta vaatii, että johdetaan ne luokassa ja järjestäytynein tapa (uskallan sanoa ".NET-tapa" ??) on luoda ominaisuuksia ja menetelmiä uudessa johdetussa luokassa muuttaaksesi asioita. John ei aluksi ollut vakuuttunut. Hän kertoi, että uusi lähestymistapansa sopii tarkoitukseensa, vaikkakin siihen, että se ei ole "COO" (oikein olosuhteet), on rajoitteita. Viime aikoina John kirjoitti kuitenkin,

"... kirjoitettuaani viiden tekstikentän sarjan suorituksen aikana, halusin päivittää tietoja seuraavassa ohjelman osassa - mutta mikään ei muuttunut - alkuperäiset tiedot olivat edelleen olemassa.

Huomasin, että voisin kiertää ongelman kirjoittamalla koodin vanhojen laatikoiden poistamiseksi ja asettamalla ne takaisin uuteen tietoon. Parempi tapa tehdä se olisi käyttää Minua. Virkistää. Mutta tämä ongelma on kiinnittänyt huomioni tarpeeseen toimittaa menetelmä, joka vähentää tekstikentät ja lisätä ne. "

Johnin koodi käytti globaalia muuttujaa seurataksesi kuinka monta ohjainta oli lisätty lomakkeeseen, joten menetelmä ...

Yksityinen alamuoto1_lataus (_
ByVal-lähettäjä järjestelmänä. Kohde, _
ByVal e As -järjestelmä. EventArgs) _
Käsittelee MyBasea. Ladata
CntlCnt0 = Me. Valvontaa. Kreivi
End Sub

Sitten "viimeinen" ohjaus voitiin poistaa ...

N = minä. Valvontaa. Luku - 1
Minä. Valvontaa. PoistaAt (N)
John totesi, että "ehkä tämä on vähän kömpelö".

Se on tapa, jolla Microsoft seuraa kohteita COM- JA yllä olevissa "rumaissa" esimerkikoodissaan.

Olen nyt palannut ongelmaan, jossa luodaan dynaamisesti ohjauksia lomakkeelle ajonaikana, ja olen tarkastellut uudelleen "Mitä tapahtui valvontaryhmiin" -artikkeleita.

Olen luonut luokat ja voin nyt sijoittaa säätimet lomakkeelle haluamallani tavalla.

John osoitti, kuinka hallita ohjainten sijoittamista ryhmälaatikkoon käyttämällä uusia luokkia, joita hän on alkanut käyttää. Ehkä Microsoftilla oli se oikein heidän "ruma" ratkaisu loppujen lopuksi!