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 Sub
EDIT: 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 Sub
Itse 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 Sub
Ja 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") Next
Sorry 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 Next
ja 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 Sub
E: 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 Sub
Juu 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.