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ää suoraanItse 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 ClassItse 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 IfJa 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 hukassaEn 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 ClassTyhjennä 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.