Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: [VB.Net] ListBoxin etsintä nimen mukaan

Sivun loppuun

novice [06.02.2009 17:57:23]

#

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.

neau33 [06.02.2009 18:33:04]

#

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

vesimies [06.02.2009 22:05:40]

#

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

Metabolix [07.02.2009 00:25:29]

#

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

neau33 [07.02.2009 09:40:36]

#

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...

vesimies [07.02.2009 14:14:59]

#

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.

novice [08.02.2009 11:06:26]

#

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ä?

Metabolix [08.02.2009 12:56:40]

#

Muuttujan pitää olla ListBox-tyyppinen. Luultavasti tuo vesimiehen jälkimmäinen vinkki on sinulle helpoin.

Grez [08.02.2009 13:11:00]

#

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")

novice [08.02.2009 14:25:27]

#

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")

Grez [08.02.2009 14:47:17]

#

No vesimieshän siitä laittoi jo esimerkkikoodin.

novice [08.02.2009 19:52:18]

#

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")

Metabolix [08.02.2009 20:02:59]

#

No ei toimi noin. Mikä siinä on niin vaikea uskoa?

Grez [08.02.2009 20:57:46]

#

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

novice [08.02.2009 22:05:47]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta