Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: taulukon järjestely

Sivun loppuun

mizzou [12.02.2007 19:43:47]

#

Nelja paivaa olen nyt yrittanyt luoda ja laittaa taulukkoa jarjestykseen (multidimensional array) ja ei homma toimi sitten niin millaan.

Taulukossa pitaisi olla etunimi ja koenumero. Esim:

Matti 55
Ville 43
Sakari 78

Yritan toteuttaa silleen etta sivulla on tuollainen lista ja nappia painamalla jarjestys muuttuisi koenumeron mukaan. Olen kahlannut nettia ja jotenkin en saa mitaan toimimaan. Kaytan Visual Web Developer 2005:sta ja kieli on VB.NET.

Juuri kun ehdin PHP:lla oppia jotain tekemaan niin sitten kurssit vaihtuivat ASP.NET 2.0:ksi. Suomipoika on nyt ihan hukassa :)

(jos tama posti meni vaaran aihe-alueen alle niin pahoittelen tapahtunutta)

Pöytälamppu [12.02.2007 20:36:16]

#

Moniulotteisen taulukon järjestey ei onnistu aivan suoraan. Helpointa (?) lienee laittaa nuo tiedot (nimi ja koenumero) omaan structureensa ja luoda oma järjestelijä-luokka joka toteuttaa IComparer-liittymän (tai laittaa structureen IComparable-liittymä) ja järjestää taulukko sillä. Eli koodina:

(IComparer-liittymä)

Structure Koetulos
    Dim nimi As String
    Dim arvosana As Int32

    Sub New(ByVal n As String, ByVal a As Int32)
        nimi = n
        arvosana = a
    End Sub
End Structure

Public Class Jarjestelija
    Implements IComparer

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim a As Koetulos = x
        Dim b As Koetulos = y

        If a.arvosana > b.arvosana Then Return -1
        If a.arvosana < b.arvosana Then Return 1
        Return 0
    End Function
End Class

'Käyttö
Dim taulu(2) As Koetulos

taulu(0) = New Koetulos("Matti", 55)
taulu(1) = New Koetulos("Ville", 43)
taulu(2) = New Koetulos("Sakari", 78)

Array.Sort(taulu, New Jarjestelija)

Tai IComparable-liittymän avulla

Structure Koetulos
    Implements IComparable

    Dim nimi As String
    Dim arvosana As Int32

    Sub New(ByVal n As String, ByVal a As Int32)
        nimi = n
        arvosana = a
    End Sub

    Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
        Dim b As Koetulos = obj

        If arvosana > b.arvosana Then Return -1
        If arvosana < b.arvosana Then Return 1
        Return 0
    End Function
End Structure

'käyttö
Dim taulu(2) As Koetulos

taulu(0) = New Koetulos("Matti", 55)
taulu(1) = New Koetulos("Ville", 43)
taulu(2) = New Koetulos("Sakari", 78)

Array.Sort(taulu) 'voidaan käyttää suoraan

Itse käytän Visual Studio 2003:a, enkä tiedä toimiiko tämä koodi Visual Web Developer 2005:lla. Itselläni ainakin toimii.

mizzou [13.02.2007 06:05:03]

#

Kiitoksia Poytalamppu nopeasta vastauksesta! Taytyi vain ihmetella kuinka hyvin koodi pelasi. Toimi hyvin Visual Web Developerissa. Otin kayttoon tuon alemman koodin patkan ja lisasin sivulleni Labelin johon tulostin taulukon for-silmukalla.

Minulla olisi pari kysymysta jotka nyt saattaa olla ihan helppojakin (minulle ylitse paasemattomia).

1.Tarkoituksena olisi saada sivu toimimaan niin etta kun se latautuu niin taulukko/lista nakyy jarjestelemattomana ja kun nappia painan niin lista muuttuu jarjestellyksi. Nyt minulla on molemmat listat nakyvilla kun en saa nappia toimimaan.

2.Miten toteutan tyhjan koetuloksen eli sanotaan vaikka etta tulos olisi hukassa eli listassa koetulos ei olisi nolla vaan siina lukisi "hukassa".

Tahan astinen koodini: (siis Poytalampun tekema ja mina vain lisasin pari rivia)

Partial Class SortPutka1
    Inherits System.Web.UI.Page
    Structure Koetulos
        Implements IComparable

        Dim nimi As String
        Dim arvosana As Int32

        Sub New(ByVal n As String, ByVal a As Int32)
            nimi = n
            arvosana = a
        End Sub

        Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
            Dim b As Koetulos = obj

            If arvosana > b.arvosana Then Return -1
            If arvosana < b.arvosana Then Return 1
            Return 0
        End Function
    End Structure

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'kaytto
        Dim taulu(5) As Koetulos

        taulu(0) = New Koetulos("Matti", 55)
        taulu(1) = New Koetulos("Ville", 43)
        taulu(2) = New Koetulos("Jaana", 1)
        taulu(3) = New Koetulos("Sakari", 78)
        taulu(4) = New Koetulos("Jussi", 0)
        taulu(5) = New Koetulos("Seppo", 99)

        'tahan lisasin silmukan tulostamaan jarjestelematon listan
        Dim i As Integer
        For i = 0 To 5
            Label2.Text &= (taulu(i).nimi & " " & taulu(i).arvosana) & "<br />"
        Next

        Array.Sort(taulu) 'voidaan kayttaa suoraan

        'tulostaa jarjestellyn listan mutta tama pitaisi saada napin taakse
        For i = 0 To 5
            Label1.Text &= (taulu(i).nimi & " " & taulu(i).arvosana) & "<br />"
        Next

    End Sub
End Class

Pöytälamppu [13.02.2007 16:45:31]

#

Itse toteuttaisin tuon niin, että oletusarvoisesti taulukkoa ei järjestettäisi, vaan vain jos sivulle annetaan parametriksi tietty arvo (esim. vaikka .../halabolo.aspx?jarjesta=1). Koodi lukisi onko parametri annettu ja jos on koodi järjestää taulun. Nappula sivulla taasen ohjaisi selaajan samalle sivulle parametrin kanssa. Eli sivu päivittyisi napin painalluksesta ja uudessa arvot olisivat järjestyksessä.

Eli:

'onko parametri annettu
Dim jarjestetaanko as Boolean = False

If Not HttpContext.Current.Request.QueryString("jarjestys") = Nothing Then
     'jos löytyy parametri ja se on jokin muu kuin nolla
     jarjestetaanko = (HttpContext.Current.Request.QueryString("jarjestys") <> 0)
End If

If jarjestetaanko Then
     'järjestetään vain jos halutaan
     Array.Sort(taulu)
End If

Ja nappulaan javaskriptiä:

//Nappulan OnClick:iin
function Button1_onclick() {
	//HUOM! toimii vain yhden parametrin kanssa
	//jos on enemmän ei toimi
	//Sitten pitää tehdä parempi ratkaisu kuin tämä hätäinen +kiireinen ratkaisu

	if (window.document.location.search.indexOf("jarjestys=1") == -1){
		//Jos ei ole
		window.document.location = window.document.location + "?jarjestys=1";
	}else{
		//Jos on niin
		//Leikataan kaikki parametrit pois
		window.document.location = window.document.location.toString().substring(0,window.document.location.toString().length - window.document.location.search.toString().length);
	}
}

Tämän toimivuudesta en sitten yhtään tiedä, kun ei ole yhtään kokemusta ASP.Net:istä ja nuo komennotkin kalastelin googlella.

Tuon hukassa-juttu lienee helpointa tehdä laittamalla arvosana = -1 , sillä kasittääkseni koenumerot eivät voi mennä pakkasen puolelle. Eli ihan simppelillä muutoksella:

Dim taulu(2) As Koetulos

taulu(0) = New Koetulos("Matti", 55)
taulu(1) = New Koetulos("Ville", 43)
taulu(2) = New Koetulos("Jaana", -1)

For i = 0 To 2
    If taulu(i).arvosana<> -1 Then
        Label1.Text &= (taulu(i).nimi & " " & taulu(i).arvosana) & "<br />"
    Else
        Label1.Text &= taulu(i).nimi & " hukassa <br />"
    End If
Next
'Tulee:
'Matti 55
'Ville 43
'Jaana hukassa

feenix [13.02.2007 18:00:37]

#

En kyllä Javascriptiä tuollaiseen hommaan sotkisi kun asian voi hoitaa ihan normaalilla linkillä joka osoittaa vastakkaiseen urliin. Turhaa sotkua sitten kun ei jollain olekaan javascriptiä päällä jne.

Pöytälamppu [13.02.2007 18:07:53]

#

Juu kyllähän se linkillä onnistuisi helpommin ja paremmin. En vain tiedä suoraan miten sellainen luodaan (ASP.netillä) ja enkä jaksanut lähteä siitä tietoa hakemaan, joten tein jonkilaisen esimerkin lähinnä kuvaamaan tekniikkaa. (Kuten kommentissa mainisin, javaskripti on vain hätäisesti koottu)

mizzou [13.02.2007 21:40:41]

#

Kiitoksia taas nopeasta vastauksesta. Tuo "hukassa"-koodi toimii juuri kuten oli tarkoitus!

Tuo nappi homma nyt askarruttaa. Mielellani pysyisin poissa JavaScriptista mutta jos ei muu auta niin sitten silla taytyy toteuttaa. Mutta nyt kuitenkin viela yritan ASP.netilla. Elikka lisasin napin (ID=ButSort) ja se jarjestaa listan mutta samalla tulee uusi jarjestelematon lista ja viimeiseksi jarjestelty.(kaikki listat tulostuu Label2:een. Elikka miten saan niin etta jarjestelemattoman listan tilalle tulee jarjestelty. Tassa minun tekeleessa jouduin taulunkin kirjoittamaan kahteen kertaan joten minun osa koodista on ihan kakkaa. Onkohan ideoita etta miten saisin tuon toimimaan?

Partial Class SortPutka1
    Inherits System.Web.UI.Page
    Structure Koetulos
        Implements IComparable

        Dim nimi As String
        Dim arvosana As Int32

        Sub New(ByVal n As String, ByVal a As Int32)
            nimi = n
            arvosana = a
        End Sub

        Public Function CompareTo(ByVal obj As Object) As Integer Implements System.IComparable.CompareTo
            Dim b As Koetulos = obj

            If arvosana > b.arvosana Then Return -1
            If arvosana < b.arvosana Then Return 1
            Return 0
        End Function
    End Structure

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'käyttö
        Dim taulu(5) As Koetulos

        taulu(0) = New Koetulos("Matti", 55)
        taulu(1) = New Koetulos("Ville", 43)
        taulu(2) = New Koetulos("Jaana", -1)
        taulu(3) = New Koetulos("Sakari", 78)
        taulu(4) = New Koetulos("Jussi", 0)
        taulu(5) = New Koetulos("Seppo", 99)

        Dim i As Integer
        For i = 0 To 5
            If taulu(i).arvosana <> -1 Then
                Label2.Text &= (taulu(i).nimi & " " & taulu(i).arvosana) & "<br />"
            Else
                Label2.Text &= taulu(i).nimi & " hukassa <br />"
            End If
        Next
    End Sub

'tasta lahtee nappi joka painettaessa jarjestaa listan mutta miten saan jarjestelemattoman listan haviamaan ja jarjestellyn siihen tilalle.
    Protected Sub ButSort_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButSort.Click
        Dim taulu(5) As Koetulos

        taulu(0) = New Koetulos("Matti", 55)
        taulu(1) = New Koetulos("Ville", 43)
        taulu(2) = New Koetulos("Jaana", -1)
        taulu(3) = New Koetulos("Sakari", 78)
        taulu(4) = New Koetulos("Jussi", 0)
        taulu(5) = New Koetulos("Seppo", 99)

        Array.Sort(taulu)

        Dim i As Integer
        For i = 0 To 5
            If taulu(i).arvosana <> -1 Then
                Label2.Text &= (taulu(i).nimi & " " & taulu(i).arvosana) & "<br />"
            Else
                Label2.Text &= taulu(i).nimi & " hukassa <br />"
            End If

        Next

    End Sub
End Class

sqwiik [13.02.2007 21:59:06]

#

Tyhjennä label ennen tulostusta. Koodia en anna, sillä VB.NET ei ole niin hyvin hanskassa että ulkoa muistaisin.

mizzou [14.02.2007 15:50:01]

#

Nettia olen kahlannut mutta ei satu silmaan. Ymmarran etta kun "jarjesta"-nappia painan niin sivu pitaisi tyhjentaa ennen kuin siihen tulostuu jarjestelty lista mutta ei onnistu minulta niin millaan. Olisiko kenellakaan ehdotuksia?

sqwiik [14.02.2007 20:24:41]

#

Laita ennen tulostusta ytimekkäästi:

label2.Text = ""

Tämän luulisi auttavan.

mizzou [14.02.2007 21:27:46]

#

Aivan mahtava homma... tuo label2.Text = "" ratkaisi ongelman. Ei tullut mieleenkaan etta noin yksinkertainen juttu voisi toimia! Kiitoksia oikein paljon Poytalampulle ja Sqwiikille neuvoista!


Sivun alkuun

Vastaus

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

Tietoa sivustosta