[VB2008] Vervangen item in listbox.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Ik heb dus het volgende form tot nu toe:

Afbeeldingslocatie: http://i15.photobucket.com/albums/a396/Modus47/VBlistboxvervangen2.gif

Let niet op de labeltjes linksonder, die gebruik ik puur voor controle van mijn gegevens.

De bedoeling van het programma is vrij voor de hand liggend, een orderlijst creëren. Je selecteert een regel, geeft een aantal en het programma rekent de prijs uit enzo. Het lastige echter is dat de listbox gedeeltelijk aangepast moet worden na een bestelling, en wel het getal in de laatste 'kolom'. Bestel ik 5x het eerste artikel dan moet na klikken op de orderbutton die 0 een 5 worden.

Mijn denkwijze:
-lees de tekst uit van het geselecteerde item
-split deze string naar een array zodat je de verschillende items in die array kunt gebruiken voor bv. de totaalprijs
-vervang bij het order bevestigen het 4e item van de array door het nieuwe aantal
-maak van deze array weer een string

Tot zover lijkt dat te lukken, als ik die string ergens in een label oproep, geeft ie precies wat ik moet hebben (zie het label rechtsonder).

Daarna loop ik vast. Op 1 of andere manier moet je dan de tekst van het geselecteerde item vervangen door die laatste string maar hoe??

Heb hier een stuk code van het form:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    Private Sub OrderListBox_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OrderListBox.SelectedIndexChanged
        TextLineArray = Split(OrderListBox.Text, ";")
        ArticlePrice = Convert.ToDecimal(Trim(TextLineArray(2)), New System.Globalization.CultureInfo("en-US"))
        Label8.Text = ArticlePrice
        If Number = 0 Then
            NumericUpDown1.Enabled = True
        End If
    End Sub

    Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged
        If NumericUpDown1.Value > 0 Then
            OrderButton.Enabled = True
        End If
    End Sub

    Private Sub OrderButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OrderButton.Click
        NewNumber = NumericUpDown1.Value
        If NewNumber = 0 Then
            MsgBox("Select a number > 0")
        Else
            TotalPrice = TotalPrice + (NewNumber * ArticlePrice)
            TotalPriceLabel.Text = "Total of orderlist € " & Format(TotalPrice, "0.00")
            NumericUpDown1.Value = 0
            TextLineArray = Split(OrderListBox.Text, ";")
            TextLineArray(3) = NewNumber
            TextLine = Join(TextLineArray, ";")
            ' OrderListBox.Items(OrderListBox.SelectedIndex) = TextLine
            Label8.Text = TextLine
        End If
    End Sub


Regel 27 heb ik dus geprobeerd, maar daarna loopt het programma vast met een verwijzing Index was outside the bounds of the array naar regel 3. Daar kan ik helemaal niks mee... Geen idee wat ik fout doe.

Heb al uitgebreid gegoogled naar allerlei varianten 'replace item in listbox', ik kom echter niet verder. Ook in mijn studieboek is niks hierover te vinden, wat wel vreemd is, de opdrachten zijn altijd gebaseerd op (een variant op) de tot dan toe behandelde stof. Is mijn aanpak überhaupt wel goed, zit ik in de goede richting of ms wel helemaal niet, kan het makkelijker, korter etc etc...

-edit
wat wellicht voor het totaalplaatje nog handig is te weten, de gewijzigde orderregel moet meteen ook naar een apart .txt-bestand worden weggeschreven. Op bovenstaand form komt nog een 'wijzig orderlijst' knop, waarmee je een nieuwe form oproept met een textbox met dat txt-bestand, waarin je het aantal handmatig kan wijzigen wat dan weer doorgevoerd moet worden in bovenstaand form.

[ Voor 5% gewijzigd door Modus47 op 26-12-2010 23:14 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:10

Haan

dotnetter

Waarom gebruik je een listbox ipv van bijv. een grid dat hiervoor bedoeld is?

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Omdat de voorbeeld .exe ook een listbox bevat en omdat een Datagrid nog niet behandeld is in de studiestof (kom het wel tegen in 1 van de laatste hoofdstukken).

-edit
1 tekstregel vervangen lukt dus wel zoals ik het wil, met die regel 27. Maar met die foutmelding kom ik niet verder, ik heb geen idee waarom hij weer in dat stukje code uitkomt.
En het idee is dus dat als je een regel selecteert die je al in de order gezet hebt, dat dan de Numeric-control en de button disabled blijven.

[ Voor 50% gewijzigd door Modus47 op 26-12-2010 23:13 ]


Acties:
  • 0 Henk 'm!

  • jip_86
  • Registratie: Juli 2004
  • Laatst online: 16:33
Ik zou objecten maken. Daarin zet je een aantal properties waar de vier waarden in staan. Vervolgens overschrijf je de ToString van dat object zodat je de gewenste string krijgt. Doordat je de ToString hebt aangepast kun je ook gewoon je object in de itemcollectie stoppen van de listbox. Voordeel van een eigen object is dat je niet elke keer hoeft te gaan splitten.

Acties:
  • 0 Henk 'm!

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 13-09 21:30
Kun je eens een breakpoint zetten bij
OrderListBox.SelectedIndex
om te kijken wat de selectedindex is?

[ Voor 58% gewijzigd door Mastermind op 27-12-2010 11:43 ]


Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Omdat de regel vervangen wel lukte (met regel 27), ben ik met de foutmelding daarna aan de slag gegaan, die gegenereerd werd op de Private Sub OrderListBox_SelectedIndexChanged. Ik heb die vervangen door een Sub OrderListBox_MouseClick1 en dan werkt het om 1 of andere reden wel goed, tot nog toe zonder foutmeldingen.

Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Tenzij dit echt een studieopdracht is en je nog helemaal niets over eigen klassen geleerd heb, zou ik je aanraden het advies van jip_86 proberen te volgen.

Een Listbox accepteert elk type item. Op het moment ben je er objecten van het type String in aan het gooien. Dat werkt, maar dat is niet zo handig, want de data die je erin gooit is eigenlijk geen String. De data is een order met een aantal waarden (nummer, naam, kosten, aantal), dus het is veel gemakkelijker als je ook daadwerkelijk een order met die waarden kunt aanmaken en die in de lijst kunt gooien.

Dat doe je door een eigen klasse te maken (genaamd Order lijkt me) met deze vier properties. Als je dan een nieuwe order in de lijst wilt gooien doe je simpelweg:
Visual Basic .NET:
1
2
3
4
5
6
7
Dim order As New Order()
order.Nummer = 589823
order.Naam = "Test Order"
order.Kosten = 43.20
order.Aantal = 3

OrderListBox.Items.Add(order)


Wil je nu een order aanpassen, dat is heel simpel, je hoeft alleen even het geselecteerde item op te vragen, deze casten naar een Order object (het is al een Order object, je moet dat alleen nog even aan de compiler vertellen), en zijn properties wijzigen;
Visual Basic:
1
2
Dim order As Order = DirectCast(OrderListBox.SelectedItem, Order)
order.Aantal += 1


Dit maakt alles zeer veel makkelijker. Als iemand een nieuwe order aanmaakt dan neem ik aan dat je ook eerst moet kijken of die al in de lijst zit. Met Strings gaat dat lastig worden en zul je alweer alles moeten splitten en het nummer controleren, bijvoorbeeld. Met Order objecten kun je gewoon door het lijstje met orders lopen en hun Nummer property opvragen.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Dit is idd een studieopdracht ja, VB bij LOI. Heb jaren geleden een paar jaar wat met ASP gedaan, dus niet alles komt me geheel onbekend voor, maar veel dus ook wel. Het gaat in dit geval idd om puur het namaken van een voorbeeldprogramma, waarvan ik wel inzie dat het bepaald geen mooie oplossing is voor een dergelijk 'ordersysteem', eerder knullig zelfs, maar daar gaat het nu ook niet om. Het gaat erom de tot nu toe behandelde stof in een opdracht te kunnen verwerken.

Classes heb ik idd nog niet gehad dus die kan ik hier moeilijk gaan gebruiken. Maar het vervangen van een item in een listbox is dat ook niet (of ik zie het over het hoofd) en dat doet mij vermoeden dat mijn aanpak wellicht niet de juiste is, maar dat heb ik dan ook nagevraagd, moet ik nog antwoord op krijgen.

Aangezien ik VB dus aan het leren ben zal het ongetwijfeld gebeuren dat ik code post die veel makkelijker/mooier/korter etc. kan, maar ja dat hoort bij leren he.

Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Je kan denk ik het beste de "replace" functie van de Listbox gebruiken:

Plaats de volgende code eens op regels 27:
code:
1
OrderListBox.Items.Item(OrderListBox.SelectedIndex) = OrderListBox.SelectedItem.Replace(TextLineArray(3), "  " & NumericUpDown1.Value)


Dat zou moeten werken. :)

[ Voor 11% gewijzigd door MasterTweaker op 27-12-2010 14:13 ]


Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Oh even voor de duidelijkheid, dat wegschrijven lukt dus al met de regel die ik al had gepost in het eerste stukje code. Alleen genereerde dat meteen daarna een foutmelding. Die heb ik inmiddels ook weg.

Acties:
  • 0 Henk 'm!

  • MasterTweaker
  • Registratie: Maart 2010
  • Laatst online: 12-09 18:01
Modus47 schreef op maandag 27 december 2010 @ 14:29:
Oh even voor de duidelijkheid, dat wegschrijven lukt dus al met de regel die ik al had gepost in het eerste stukje code. Alleen genereerde dat meteen daarna een foutmelding. Die heb ik inmiddels ook weg.
Oke maar wat is nu dan nog je probleem?

Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Voor dit specifieke probleem eik niks meer, afgezien van het idee dat ik dit wellicht mooier had kunnen doen, ook met de beperkte kennis die ik nu heb. Maar is lastig te zeggen neem ik aan als je niet weet wat ik allemaal aan stof heb meegekregen nu.

En als ik verder denk aan de rest van deze opdracht, zou iets wat ik nu gemaakt heb weer voor nieuwe problemen kunnen zorgen later in de opdracht.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Toevallig al eens gegoogled op je opdrachtnummer btw? :X :D Kant-en-klare zipfiles galore :Y) En hoewel ik érg terughoudend zou zijn in dingen voor "waar" aannemen die je daar ziet/vindt, misschien kun je er nog wat tips uit halen of mensen vinden die wél op de hoogte zijn van die opdracht of met dezelfde cursus bezig zijn. Dat praat wellicht makkelijker dan hier ;)

[ Voor 72% gewijzigd door RobIII op 27-12-2010 15:14 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Modus47
  • Registratie: Maart 2010
  • Niet online
Nee, eerlijk gezegd nog geen seconde aan gedacht, maar nu dus wel. Een paar linkjes zal ik eens bekijken maar ik vogel het toch liever zelf uit in eerste instantie dan de hapklare oplossing voor me te krijgen.

Per probleem probeer ik hier dan ook zo uitgebreid mogelijk weer te geven wat er speelt. Maar ik moet er ook bij zeggen dat als ik iets post ik ook gewoon zelf blijf doorzoeken en dingen proberen, kan wel op de eerste reply wachten maar dat is ms alleen maar een wedervraag.
Pagina: 1