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)
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.
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
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
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.
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)
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
Tyhjennä label ennen tulostusta. Koodia en anna, sillä VB.NET ei ole niin hyvin hanskassa että ulkoa muistaisin.
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?
Laita ennen tulostusta ytimekkäästi:
label2.Text = ""
Tämän luulisi auttavan.
Aivan mahtava homma... tuo label2.Text = "" ratkaisi ongelman. Ei tullut mieleenkaan etta noin yksinkertainen juttu voisi toimia! Kiitoksia oikein paljon Poytalampulle ja Sqwiikille neuvoista!
Aihe on jo aika vanha, joten et voi enää vastata siihen.