Alkuun pahimpia kompastuskiviä on kontrollien indeksoimattomuus VB.Net:ssä.Miten esim. seuraava koodataan VB.Net:ssä.
On kolme labelia, VB5:ssä nimetty lblN ja indeksoitu 0, 1 ja 2. Alussa kunkin Caption = "0". Kun klikkaan labelia, kasvaa sen lukema yhdellä ja toimii koodilla:
Private Sub lblN_Click(Index As Integer) lblN(Index) = lblN(Index) + 1 End Sub
Miten VB.Netissä ? Jos labeleita on vain kolme, ne voi tietysti nimetä eri nimille ja tehdä jokaiselle koodi erikseen. mutta jos niitä on kymmeniä tai satoja niin pakko tehdä jollain muulla tavalla.
Voi ne tehdä ihan taulukkona. Mutta graafisella editorilla ei voi tehdä sellaista. Yleensä jos tarvitaan vaikka sata, niin ne olisi joka tapuaksessa helpompi generoida ohjelmallisesti.
Nimen omaan generointi ohjelmallisesti mutta miten niihin viitataan kun ei ole indeksejä.
Niissä on indeksit jos teet niihin indeksit. Pitäisi varmaan etsiä ketju johon viimeksi kirjoitin esimerkin.
Edit: En nyt löytänyt, niin kirjoitin uuden
Public Class Form1
Dim lblN As New Dictionary(Of Integer, Label)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i As Integer
Me.SuspendLayout()
For i = 0 To 99
Dim l = New Label()
l.AutoSize = True
l.Location = New System.Drawing.Point(0, 20 * i)
l.Name = "lblN_" & i
l.Size = New System.Drawing.Size(39, 13)
l.TabIndex = i
l.Text = "0"
lblN(i) = l
Me.Controls.Add(l)
AddHandler l.Click, AddressOf lblN_Click
Next
Me.ResumeLayout()
End Sub
Private Sub lblN_Click(ByVal sender As Label, ByVal e As System.EventArgs)
sender.Text = (CInt(sender.Text) + 1).ToString()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ix As Integer
Dim r As New Random()
ix = r.Next(99)
MessageBox.Show("LblN(" & ix & ") arvo on " & lblN(ix).Text)
End Sub
End ClassSuurkiitokset, Grez! Eipä tuo hirveän pahalta näytä. Tuohon kielioppiin pitäisi vaan syventyä. VB5:ssä on erinomainen helppi ja editori ja lisäksi vielä VB on Line. Asennanpa tuon Expressin uudelleen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.