En äkkiä keksinyt parempaa otsikkoa...
Formilla listboxeja nimeltään: boxi1, boxi2, boxi3, jne.
Miten saan aliohjelmalla asetettua tietoa johonkin tiettyyn listboxiin?
Kokeilin tällaista, mutta ei toiminut:
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim tieto As String = "sdgfafgd"
Call lisää_boxiin(tieto, 1)
End Sub
Sub lisää_boxiin(ByVal tieto As String, ByVal nro As Integer)
Dim boxi As ListBox = New ListBox
boxi.Name = "boxi" & nro
boxi.Items.Add(tieto)
End SubEDIT: Tajuan jo miksi tuo ei toimi, mutta kysymys on edelleen voimassa.
Heippa novice!
vääntele näistä...
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Static cnt As Integer
Dim item As String = "Item"
Dim boxcnt As Integer = 0
cnt += 1
For Each ctl As Control In Me.Controls
If TypeOf(ctl) Is ListBox Then
If ctl.Name = "listBox" & CStr(cnt) Then
BoxItemsAdd(ctl, item)
End If
boxcnt += 1
End If
Next
If cnt = boxcnt Then
cnt -= cnt
End If
End Sub
Sub BoxItemsAdd(ByVal box As Object, ByVal item As String)
If TypeOf(box) Is ListBox Then
box.Items.Add(item)
End If
End SubItse ehkä taulukoisin listboksit jotenkin tähän tapaan:
Private Enum ListaBoksiNro As Integer
boksi1 = 0 ' alkaa nollasta
boksi2
boksi3
viimeinen = boksi3
End Enum
Private ListaBoksiTaul(ListaBoksiNro.viimeinen) As ListBox
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListaBoksiTaul(ListaBoksiNro.boksi1) = Me.boxi1
ListaBoksiTaul(ListaBoksiNro.boksi2) = Me.boxi2
ListaBoksiTaul(ListaBoksiNro.boksi3) = Me.boxi3
' Testiosuus:
LisääBoksiin("VB", ListaBoksiNro.boksi1)
LisääBoksiin("Helmi", ListaBoksiNro.boksi2)
LisääBoksiin("Käyttöliittymä", ListaBoksiNro.boksi3)
LisääBoksiin("C++", ListaBoksiNro.boksi1)
End Sub
Private Sub LisääBoksiin(ByVal tieto As String, _
ByVal nro As ListaBoksiNro)
If nro >= 0 And nro <= ListaBoksiNro.viimeinen _
Then ListaBoksiTaul(nro).Items.Add(tieto)
End SubJa minä ottaisin tuosta vielä Enuminkin pois. Jos kerran numeroita käytetään, niin helpompi on kirjoittaa "Laatikko(1)" kuin "Laatikko(LaatikonNumero.Laatikko1)" puhumattakaan mahdollisista silmukoista tai muista indeksimuuttujaa hyödyntävistä rakenteista:
For i = 0 To Laatikko_N - 1
Laatikko(i).Items.Add("Kaikkiin sama rivi")
NextSorry novice!
Jutska ei pelitä siksi, että...
luot tässä aivan uuden ListBox-objektin
Dim boxi As ListBox = New ListBox
kun sitten nimeät objektisi jo olemassa olevalla nimellä
tulee siitä automaattisesti uusi boxi1:n ilmentymä,
jolloin sama toistuu joka kerta kun painat nappulaa...
boxi.Name = boxi & nro
ymmärrät mistä on kysymys, kun testaat jutskaa näin...
'lisää aliohjelmasi koodin perään rivit... static i As Integer boxi.Location = New Point(0 + i, boxi2.Top + boxi.Height) boxi.Visible = True me.Controls.Add(boxi) i += boxi.Width
lisää sitten formille vielä uusi nappi, iske koodiksi...
For Each ctl As Control In Me.Controls
If ctl.Name = "boxi1" Then
Dim boxi As ListBox = ctl
boxi.Items.Add("qwerty")
boxi = Nothing
End If
Nextja painele nappuloita...
Juu aivan totta Metabolix. Enum onkin tosiaan tässä turha.
Sitten on kyllä vielä ainakin yksi mahdollisuus kaivaa kontrolli nimen mukaan, mutta enpä tiedä onko tämä niin kätevä kuin taulukointi. Tässä kuitenkin haku Controls.Find-metodia käyttäen:
Private Sub LisääBoksiin(ByVal tieto As String, _
ByVal nro As Integer)
Dim kontrTaul() As Control = Me.Controls.Find("boxi" + CStr(nro), False)
' If UBound(kontrTaul) > -1 Then
Dim lb As ListBox = kontrTaul(0)
lb.Items.Add(tieto)
' Else
' Throw New ArgumentOutOfRangeException("Numero ei hyvä.")
' End If
End SubE: Niin onhan se kyllä näppärä mutta hieman raskas hakea joka kerta tuohon kontrTaul()-taulukkoon.
Kiitos vastauksista.
Saan näistä kyllä jotain rakennettua.
Onko nyt niin, että 'Listbox1.items.add()' kutsussa ei voi mitenkään käyttää muuttujaa.
Esim.
dim muuttuja as string = "listbox3"
muuttuja.items.add("plaaplaa")Vai pitäiskö muuttujan tyypin olla jokin muu, mikä?
Muuttujan pitää olla ListBox-tyyppinen. Luultavasti tuo vesimiehen jälkimmäinen vinkki on sinulle helpoin.
novice kirjoitti:
Onko nyt niin, että 'Listbox1.items.add()' kutsussa ei voi mitenkään käyttää muuttujaa.
Toki voi käyttää. Omaa esimerkkiäsi mukaillen.
Dim muuttuja As System.Windows.Forms.ListBox = ListBox3
muuttuja.Items.Add("plaaplaa")Grez kirjoitti:
novice kirjoitti:
Onko nyt niin, että 'Listbox1.items.add()' kutsussa ei voi mitenkään käyttää muuttujaa.
Toki voi käyttää. Omaa esimerkkiäsi mukaillen.
Dim muuttuja As System.Windows.Forms.ListBox = ListBox3 muuttuja.Items.Add("plaaplaa")
Ahaa.. sihen pitää laittaa tuo koko litania... no niimpä tietenkin, tottakai. Omasta mielestäni kokeilinkin tuota, mutta ei toiminut. Ilmeisesti jotain muuta oli pielessä.
EDIT: Eikun... tarkoitin tätä, miten tämän saisi toimimaan?
dim numero as integer
'
'
'
Dim muuttuja As System.Windows.Forms.ListBox = "ListBox" & numero
muuttuja.Items.Add("plaaplaa")No vesimieshän siitä laittoi jo esimerkkikoodin.
Siis tässä tapauksessa muuttujaa ei voi käyttää... tämähän oli se alkuperäinen ongelma mihin lähdin vastausta hakemaan.
dim numero as integer
'
'
'
Dim muuttuja As System.Windows.Forms.ListBox = "ListBox" & numero
muuttuja.Items.Add("plaaplaa")No ei toimi noin. Mikä siinä on niin vaikea uskoa?
novice kirjoitti:
EDIT: Eikun... tarkoitin tätä, miten tämän saisi toimimaan?
dim numero as integer ' ' ' Dim muuttuja As System.Windows.Forms.ListBox = "ListBox" & numero muuttuja.Items.Add("plaaplaa")
Ilmeisesti se soveltaminen on ihan oikeasti ylivoimaista :(
Siis tälleen:
Sub Joo(ByVal numero As Integer)
'
Dim Nimi As String = "ListBox" & numero
Dim kontrTaul() As Control = Me.Controls.Find(Nimi, False)
Dim Muuttuja As ListBox = CType(kontrTaul(0), ListBox)
Muuttuja.Items.Add("plaaplaa")
End SubJuu juu... älkää hermoilko, homma ollut hanskassa jo puolenpäivän aikoihin. Kunhan varmistelin, ja asia nyt täysin selvä. Kiitokset vielä kaikille.
Asia loppuun käsitelty.
Aihe on jo aika vanha, joten et voi enää vastata siihen.