Cijfers sorteren in VB.net

Status
Niet open voor verdere reacties.

Scandax

Gebruiker
Lid geworden
1 feb 2011
Berichten
161
Beste leden,

Voor school moet ik een programmaatje schrijven dat cijfers op volgorde zet van groot naar klein. Deze cijfers zullen na het sorteren, weer gegeven moeten worden in een tabel. Ik heb gelezen dat je cijfers kunt sorteren met een array.sort functie. Hieronder mijn begin van de array:

Code:
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim getallen As Integer() = {3, 6, 5, 9, 1} // in plaats van deze door mij ingevulde getallen, moet de gebruiker de getallen zelf kunnen invullen
        Array.Sort(getallen)

    End Sub
End Class

Nu vraag ik me alleen af hoe ik zoiets in een tabel moet laten weergeven? Heb zelf al een aantal kleine dingetjes gedaan in VB.net, maar cijfers sorteren staat niet in dat rijtje.

Als extra opdracht bij deze opdracht moet je dit ook met letters doen, maar dat is nu nog niet aan de orde. Als ik dit eenmaal snap, zal ik dat met de letters ook wel snappen ;)
Heb zelf ook al gezocht, maar het probleem ligt 'm bij het weergeven in een tabel.

Bij voorbaat dank voor alle hulp,
Scandax
 
Laatst bewerkt:
In een tabel weergeven? Hoe moet die tabel eruit zien dan?
 
Als je het in een listbox wilt zetten dan kan dat zo:
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

Als je het in een listview wil zetten kan dat zo:
Code:
        Dim getallen As Integer() = {3, 6, 5, 9, 1}
        Array.Sort(getallen)

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


Dan over de letters:
Ieder teken heeft een ASCII code: http://nl.wikipedia.org/wiki/ASCII_%28tekenset%29
Zoals je in die link kan zien, zijn dat eigenlijk gewoon getallen... De ASCII codes van de tekens kan je dus gewoon hetzelfde behandelen als getallen. Let wel op dat het waarschijnlijk niet de bedoeling is dat getallen en letters door elkaar komen......

Ok, ASCII is dus een manier om dat te doen. Visual Basic heeft een (goede) support voor het maken van ASCII codes en het terughalen van de tekens.
Om een ASCII code te maken van een teken gebruik je dit:
Code:
Dim A As Integer = Asc("A")
Om daarvan dan weer een A te krijgen gebruik je dit:
Code:
Dim B As String = Chr(A)
A moet hierin dan dus een getal bevatten.



Ik hoop dat je hiermee al een eind komt.

Succes!:thumb:
MartinJM
 
Hartelijk dank voor de enorm goede uitleg. Zal morgen eens Proberen, als ik tijd heb. Uiterlijk donderdag zal ik Antwoorden.
 
Heb een enorm drukke week deze week, en heb helaas nog steeds geen tijd gehad om dit te proberen. Morgenmiddag heb ik (zoals het er nu naar uitziet) tijd genoeg om hieraan te werken en zal ik vertellen hoe het gegaan is.

Scandax
 
Heb net geprobeerd en ik snap wat er gedaan word. Nu heb ik 10 textboxen, en de invoer in de textboxen moeten worden gesorteerd. Nu rest mij de enige vraag: Hoe kan ik ervoor zorgen dat die getallen in de textbox worden gesorteerd?

Scandax

Edit: Zie net dat ik 3 posts achter elkaar heb geplaatst, sorry...
 
Laatst bewerkt:
Ok, plaats een panel op je form met daarin het aantal textboxen wat je wilt hebben. In de code die ik heb gemaakt moeten dat er evenveel (of minder) zijn dan het aantal nummers...
In het panel mogen alleen die textboxen zitten, anders kan het fout gaan!!!

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

        Dim teller As Integer = 0

        For i As Integer = 0 To getallen.Length - 1 Step 1
            CType(Panel1.Controls(teller), TextBox).Text = getallen(i)
            teller += 1
        Next

Misschien zie je het meteen, maar ik heb nog een klein beetje meer aangepast: "For i As Integer = 0 To getallen.Length - 1 Step 1" omdat ik daar eerst een error bij kreeg...:confused:


Succes!:thumb:



*EDIT*
Nog een klein stukje code gemaakt:
Code:
            If teller = Panel1.Controls.Count Or teller > Panel1.Controls.Count Then
                Exit For
            End If
Als je dit direct onder "teller += 1" zet, dan zou de array volgens mij groter kunnen zijn dan het aantal textboxen.

Succes!:thumb:
 
Laatst bewerkt:
@MartinJM: Je kan controleren of het control een textbox is :)

[cpp]For Each item As Control In Panel.Controls
If TypeOf item Is TextBox Then ....
Next[/cpp]

[Edit] Kan zelfs nog makkelijker:

[cpp]For Each item As TextBox In Panel.Controls
''//code
Next[/cpp][/edit]
 
Laatst bewerkt:
Ok, dankje! Die kende ik nog niet... Ik heb het zelf wel eens anders gedaan: met een try-catch blok, maar dat is natuurlijk niet echt handig....
 
Bij deze line gaat het mis:
CType(Panel1.Controls(teller), TextBox).Text = getallen(i)
Error:
Index0 is out of range
Parameter: Index0

@JoZ1

Zal ik zo eens proberen :) Best handige code.
 
Laatst bewerkt:
Ok, raar, even een paar vraagjes:


Heb je het 2e stukje code ook gebruikt, of heb je alleen het eerste stukje code gebruikt??

Hoeveel textboxen gebruik je nu en hoeveel getallen staan er in de array?

Wat is de waarde van i en wat is de waarde van teller ten tijde van de error?
 
Laatst bewerkt:
Niet gezien dat er een 2e stukje code was bijgekomen, teveel gefocust op het sorteren denk ik. Heb 10 textboxen, en ik snap de code niet :P
Als de waarde van i een cijfer uit een textbox is, dan zijn dat alle cijfers tussen de 0 en de 10 (incl. 0).
En, als ik het eerste stuk code heb gebruikt, hoe gebruik ik dan het 2e stukje?
 
Code:
        Dim getallen As Integer() = {3, 6, 5, 9, 1, 3}
        Array.Sort(getallen)

        Dim teller As Integer = 0

        For i As Integer = 0 To getallen.Length - 1 Step 1
            CType(Panel1.Controls(teller), TextBox).Text = getallen(i)
            teller += 1

            If teller = Panel1.Controls.Count Or teller > Panel1.Controls.Count Then
                Exit For
            End If
        Next
 
Error.PNG
Ik krijg een foutmelding. Zie bijlage.
De code die ik heb:

Code:
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Application.Exit()
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click


    End Sub

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
        Dim getallen As Integer() = {3, 6, 5, 9, 1, 3}
        Array.Sort(getallen)

        Dim teller As Integer = 0

        For i As Integer = 0 To getallen.Length - 1 Step 1
            CType(Panel1.Controls(teller), TextBox).Text = getallen(i)
            teller += 1

            If teller = Panel1.Controls.Count Or teller > Panel1.Controls.Count Then
                Exit For
            End If
        Next
    End Sub
End Class

Veel lege plekken, maar denk niet dat de invloed hebben op de "sorteer-code".
 
Vul deze code eens in bij b.v button1_click:
Code:
MsgBox(Panel1.Controls.Count)
Start dan je programmaatje en druk op button1. Er zal dan een popup komen waarin een getal staat. Plaats dat dan hier online.
 
Daar komt het getal 0 uit.

Edit: Als ik het goed begrijp heeft het panel dus geen inhoud .., Heb het Panel in de hele form gedocked (dock in parent container).
 
Laatst bewerkt:
Jep, zorg ervoor dat de textboxen echt in de panel staan. Ze mogen ook niet uitsteken. Ik zou ze dus ook een beetje uit de rand van de panel houden.
Daarna zou het moeten werken...
 
Heb op "Dock panel in parent conatiner" geklikt, maar er blijft 0 uit komen. Niets steekt uit.
 
Screenshot van mijn form zit in de bijlage: error2.jpg
Screenshot van mijn code, mocht het nodig zijn: error3.PNG
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan