Cijfers sorteren in VB.net

Status
Niet open voor verdere reacties.
Als jij denkt dat dat makkelijker is, dan kan dat. Maakt voor ons (volgens mij) niet zoveel uit.... Wel weer extra werk...
 
xP. Ik heb geen idee of het makkelijker is, maar volgens Joz1 wel :P.
Maar wat denk jij dat ik nu het beste kan doen?
 
Aangezien het met het panel eerst niet helemaal goed ging en je van plan bent nu een listbox te gaan gebruiken, zou ik zeggen dat het wel loont om het opnieuw te bouwen... Maar als er nog veel andere controls op het oude form staan, dan is het misschien niet zo handig...

Maar uiteindelijk is het jouw keuze...:thumb:
 
Ben net een nieuw project begonnen, en heb jouw code gebruikt:

Code:
        Dim getallen As Integer() = {3, 6, 5, 9, 1}
        Array.Sort(getallen)

        For Each i As Integer In getallen
            ListBox1.Items.Add(i)
        Next

Nu rest mij eigenlijk alleen de vraag, hoe zorg ik ervoor dat
Code:
Dim getallen As Integer() = {3, 6, 5, 9, 1}
de getallen (de reeds ingevoerde 3, 6, 5, 9, 1) veranderen naar de inhoud van de 10 textboxen? Want die inhoud zal uiteindelijk gesorteerd moeten worden. Er mogen geen letters instaan, en enkele mogen ook leeg ingevuld worden.

Scandax

!!! EDIT:

Heb de volgende code gemaakt, en het werkt redelijk:

Code:
        Dim getallen As String() = {TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text, TextBox6.Text, TextBox7.Text, TextBox8.Text, TextBox9.Text, TextBox10.Text}
        Array.Sort(getallen)

        For Each i As String In getallen
            ListBox1.Items.Add(i)
        Next

De bovenstaande 'actie' gebeurd wanneer je op button 1 klikt.
Nieuwe vraag: Als ik het cijfer 10 intype in een van de textboxen, komt de 10 1 rang boven de 1 te staan terwijl dit het grootste cijfer is. Hoe zorg ik ervoor dat de computer hem als laatste plaatst? Het is natuurlijk de bedoeling dat ze van groot naar klein worden gerangschikt.

Scandax
 
Laatst bewerkt:
Dat kun je beter zo doen:

[CPP]Dim nummers As New ArrayList
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is TextBox Then nummers.Add(ctrl.Text)
Next
nummers.Sort()

For Each item As String In nummers : ListBox1.Items.Add(item) : Next[/CPP]

:)
 
Ik neem aan dat alle textboxen in een panel staan:
Code:
        Dim getallen(Panel1.Controls.Count) As Integer
        Dim teller As Integer = 0

        For Each Txtbox As TextBox In Panel1.Controls
            If Not Txtbox.Text = Nothing Then
                If IsNumeric(Txtbox.Text) Then
                    getallen(teller) = Txtbox.Text
                    teller += 1
                End If
            End If
        Next

De code werkt niet helemaal, aangezien er ook nog een aantal overbodige nullen bij komen te staan als er een textbox leeg is.... Dat is vast wel op te lossen, maar daar heb ik nu niet zoveel tijd voor...


Succes!:thumb:



Toch nog even een verbetering:
Code:
        Dim getallen(Panel1.Controls.Count) As Integer
        Dim teller As Integer = 0

        For Each Txtbox As TextBox In Panel1.Controls
            If Not Txtbox.Text = Nothing Then
                If IsNumeric(Txtbox.Text) Then
                    getallen(teller) = Txtbox.Text
                    teller += 1
                End If
            End If
        Next

        ReDim Preserve getallen(teller - 1)
Hierbij verdwijnen de extra nullen. Wat me nu wel was opgevallen, was dat de textboxen (bij mij) van onder naar boven werden uitgelezen. Als je alsnog de sort functie gebruikt, zal je daar geen last van hebben.



*EDIT*
Oeps, een paar posts van Joz gemist.... :o
 
Laatst bewerkt:
Als het inderdaad in een panel staat, dan is mijn code zo:


[cpp]Dim nummers As New ArrayList
For Each ctrl As Control In Panel1.Controls
If TypeOf ctrl Is TextBox Then nummers.Add(ctrl.Text)
Next
nummers.Sort()

For Each item As String In nummers : ListBox1.Items.Add(item) : Next[/cpp]
 
Ook bij mij word er van onder naar boven gelezen. Op zich komen alle codes op hetzelfde neer, en zie ik als gebruiker geen verschil. Als een textbox leeg is, kun je gewoon ze gewoon de waarde 0 geven als je op button1 klikt (correct me if I'm wrong).

Die 10 blijft tussen de 1 en 2 staan. Hoe haal ik die daar weg? Of iemand moet mij vertellen dat een 10 een kleiner getal is dan 2... :D
 
Laatst bewerkt:
Ik moet nu ook gaan. Dank voor de alweer uitstekende hulp.
Thumbs up :)

Edit:

Ben net verder gegaan. Heb geen panel gebruikt deze keer. Hier mijn code:

Code:
  If TextBox1.Text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text = "" Or TextBox5.Text = "" Or TextBox5.Text = "" Or TextBox6.Text = "" Or TextBox7.Text = "" Or TextBox8.Text = "" Or TextBox9.Text = "" Or TextBox10.Text = "" Then
            MsgBox("Een of meerdere velden zijn leeg. Voer a.u.b. cijfers (tussen de 0 en 10) in.")
        Else
            If Not IsNumeric(TextBox1.Text) Or Not IsNumeric(TextBox2.Text) Or Not IsNumeric(TextBox3.Text) Or Not IsNumeric(TextBox4.Text) Or Not IsNumeric(TextBox5.Text) Or Not IsNumeric(TextBox6.Text) Or Not IsNumeric(TextBox7.Text) Or Not IsNumeric(TextBox8.Text) Or Not IsNumeric(TextBox9.Text) Or Not IsNumeric(TextBox10.Text) Then
                MsgBox("Alleen getallen kunnen worden gesorteerd. Voer a.u.b. alleen getallen in.", vbInformation)
            Else
                Dim getallen As String() = {TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text, TextBox5.Text, TextBox6.Text, TextBox7.Text, TextBox8.Text, TextBox9.Text, TextBox10.Text}
                Array.Sort(getallen)

                For Each i As String In getallen
                    ListBox1.Items.Add(i)
                Next
                Button1.Enabled = False
                Button2.Enabled = True
            End If
        End If

Nu controleert hij of textbox1.text numeriek is. Is het ook mogelijk om hem alle textboxen in een keer te laten controleren? Als je alles op deze manier moet gaan uitleggen aan je pc, word je code wel heel erg lang.

Edit: Nieuwe code, zie hierboven :) Past er alleen niet helemaal in zie ik...
Hiermee zijn ook de meeste problemen opgelost, alleen mag de inhoud van een textbox niet kleiner zijn dan 0 en niet groter zijn dan 10. Hoe doe ik dat???
 
Laatst bewerkt:
Wat je nu aan het doen is is volgens mij veel te veel werk. We hebben je al eerder voorbeelden gegeven van loops die alle textboxen afgaan... Die loops kan je natuurlijk aanpassen zodat je ze hier handig kan gebruiken...
Ook voor als je textboxen niet in een panel staan, is er al minstens 1 code gegeven. Die kan je dan zelf ook aanpassen.

Wat ik bedoel is: Het is overbodig veel werk om op deze manier alle textboxen langs te gaan. Met een eerder gegeven loop gaat dat veel sneller (het maken v/d code). Als het je niet lukt om die te gebruiken, geef dan aan waar dat verkeert gaat, dan kunnen wij je daarbij helpen.

Succes!
 
Een loop is inderdaad veel makkelijker. Heb de code gebruikt zoals JoZ1 hem heeft geschreven. De enige problemen waar ik tegenaan loop is dat de 10 tussen de 1 en 2 staat (er wordt alleen gekeken naar het eerste cijfer, denk ik) en de invoer mag niet kleiner zijn dan 0 en niet groter zijn dan 10.

Edit:
Heb ervoor kunnen zorgen dat alleen cijfer tussen -1 en 11 kunnen worden ingevoerd, maar als -0,5 word ingevoerd wordt deze natuurlijk wel gesorteerd. Hoe kan ik in de code zeggen dat alleen getallen tussen de 0,0000001 en 10,0000000000001 mogen?

Klein stukje:
Code:
CInt(TextBox1.Text) > -1 And CInt(TextBox1.Text) < 11

Als ik van die -1 -0,000001 of -0.000001 maak dan doet hij het niet. Zelfde geld voor de 11.
 
Laatst bewerkt:
Laatst bewerkt:
Dank, zal hier morgen naar kijken. Met en if statement is dat inderdaad mogelijk, maar dacht dat er misschien een kortere weg was. Aangezien het alleen de 10 betreft, is het ook mogelijk dit handmatig te doen maar ik had gehoopt dat hierbook ergens een kortere weg was.
 
Heb Het volgende neergezet:

Code:
If CDec(TextBox1.Text) > -0.000000001 And CInt(TextBox1.Text) < 10.00000000001 Then
...

CInt veranderd naar CDec. Nu werkt het zoals het hoort.
Weet alleen niet goed hoe ik die 10 weg moet werken? Heb een variable gemaakt voor die textboxen (genaamd 'getallen'), en die worden dan gesorteerd (reeds bekende koek). Hoe zorg ik ervoor dat als een of meerdere getallen 10 zijn, deze niet worden gesorteerd maar later worden toegevoegd?

Vrijdag a.s. is trouwens de deadline.

M.v.gr.,
Scandax

Edit: Als ik 10,05 invul in een van de velden, wordt die wel mee gesorteerd terwijl dat eigenlijk niet zou moeten kunnen (zie de code hierboven).
 
Laatst bewerkt:
Er staat nog steeds een CInt in je code...

En voor het andere probleem:
Je kan weer met een loop checken of een van de getallen in de array een 10 is. Die kan je er dan (tijdelijk) uithalen om hem vervolgens achteraan neer te zetten.


Succes!
 
Voor de CInt:
omg, slordig...

En voor die 10:
Ik heb eerst eens zo gedaan:
Code:
If TextBox1.Text = ("10") Then
                        Dim tien As Integer = 10
                        ListBox1.Items.Remove(tien)
                        ListBox1.Items.Add(tien)

Die variabele is overbodig... Alleen, hij verwijderd de 10 niet maar voegt wel een 10 toe? Dat vind ik best raar, aangezien het om dezelfde variabele gaat...
 
Code:
Listbox1.items.remove(##)
Je moet even kijken wat er op de plaats van de 2 hekjes (##) moet komen... Daarin zit namelijk de fout...

MartinJM
 
Laatst bewerkt:
Dank, heb het gevonden. Het lag aan de "-tekentjes. Hieronder de code:

Code:
Listbox1.items.remove("10")

Ook weer slordig van mij...
 
Nu, het allerlaatste probleem denk ik: Ik heb iets nodig voor in VB dat in de spreektaal en/of betekend. Lastig om zo uit te leggen, zie de code:

Code:
If TextBox1.Text = ("10") Or TextBox2.Text = ("10") Or TextBox3.Text = ("10") Then
...

Als ik nu twee keer een 10 in vul, komt een 10 tussen de 1 en 2 te staan en de andere op het einde. Ik heb dus iets nodig wat die Or kan vervangen en en/of betekend... Als je snapt wat ik bedoel :S

Maar moet nu gaan.., dank voor de hulp (again) :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan