Just nu i M3-nätverket
Gå till innehåll

Skriva ut databasinformation.


Coffer

Rekommendera Poster

Hejsan!

 

För att skriva ut en databaspost skriver man ju så här:

 

<%# DataBinder.Eval(Container.DataItem, "Namnpåposten") %>

 

Men om man vill skriva ut samma värde med hjälp av en Response.Write(""), hur gör man då? För detta fungerar INTE:

 

Response.Write(# DataBinder.Eval(Container.DataItem, "ThreadCreated"))

 

Hur gör man?

 

MVH

// Kristofer Gisslén

 

Länk till kommentar
Dela på andra webbplatser

Strunta i Response.Write!!

 

Använd inte det i .Net!!!!!! Grrr :-)

 

Säg vad du vill åstakomma istället, så finns det säkert andra vägar att uppnå det.

 

Länk till kommentar
Dela på andra webbplatser

Hehe... visste inte att det var så fel. ;)

 

Jag vill skapa en funktion som undersöker hur gammal ett inlägg är i ett forum, genom att skriva ut olika ikoner framför inlägget i en trådlista. Jag har skrivit om koden så den nu ser ut så här:

 

Function ShowThreadIcon()
Dim objCmdPostIcon as new OleDbCommand("SELECT * FROM Threads WHERE TopicID=" & Request.Querystring("channel") & " ORDER BY ThreadCreated DESC", objConn)
Dim objReader As OleDbDataReader

objConn.Open
objReader = objCmdPostIcon.ExecuteReader
Dim strPostIcon As DateTime
While objReader.Read()
strPostIcon = objReader.GetDateTime(6).ToString("d")
End While
objConn.Close

If strPostIcon = Now.ToString("d") Then
Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/new_post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Ny tråd, nytt inlägg"" /><br />")
Else
Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Gammal tråd, gammalt inlägg"" /><br />")
End If
End Function

 

Problemet med denna kod är att om listan med inlägg är mer än en post lång, så hämtar koden ovan endast värdet för den post som ligger först i längden. Den hämtar inte in klockslaget för varje inlägg.

 

Hur gör jag?

 

MVH

// Kristofer Gisslén

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Du har ju lagt all kod som behandlar ikonerna utanför loopen. Ändra till:

 

[log]Function ShowThreadIcon()

Dim objCmdPostIcon as new OleDbCommand("SELECT * FROM Threads WHERE TopicID=" & Request.Querystring("channel") & " ORDER BY ThreadCreated DESC", objConn)

Dim objReader As OleDbDataReader

 

objConn.Open

objReader = objCmdPostIcon.ExecuteReader

Dim strPostIcon As DateTime

While objReader.Read()

strPostIcon = objReader.GetDateTime(6).ToString("d")

If strPostIcon = Now.ToString("d") Then

Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/new_post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Ny tråd, nytt inlägg"" /><br />")

Else

Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Gammal tråd, gammalt inlägg"" /><br />")

End If

 

End While

objConn.Close

 

End Function[/log]

 

Länk till kommentar
Dela på andra webbplatser

Ahh... klantigt. Det stämmer. Men då uppstår nästa problem. Nu skriver den ut alla ikoner motsvarande antalet inlägg i varje tråd på varje rad motsvarande ett inlägg i databasen. Jag skall försöka att illustrera vad jag menar:

 

Tabellcell 1:

Innehåller ikonen

 

Tabellcell 2:

Innehåller namnet på rubriken

 

Säg att det finns fyra inlägg i tråden.

 

Tabellcell 1, Tabellcell 2.

Tabellcell 1, Tabellcell 2.

Tabellcell 1, Tabellcell 2.

Tabellcell 1, Tabellcell 2.

 

Koden som jag nu redigerade till skriver ut fyra ikoner i Tabellcell 1. Skulle det skrivas ett till inlägg så lägger koden in 5 ikoner i Tabellcell 1 och så vidare. Hur kommer man runt det problemet?

 

MVH

// Kristofer Gisslén

 

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Du måste ha in tabelltaggarna (om det är en html-tabell du använder förtås) i loopen också. Ex:

 

[log]

While objReader.Read()

strPostIcon = objReader.GetDateTime(6).ToString("d")

If strPostIcon = Now.ToString("d") Then

Response.Write("<tr><td>" & strPostIcon & "<img src=""skin/eDiskus_default/new_post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Ny tråd, nytt inlägg"" /></td><td>TITELN HÄR</td></tr>")

Else .....

 

och samma sak i else-satsen

 

[/log]

 

- Chris

 

/* There is nothing more permanent than a temporary solution... */

 

Länk till kommentar
Dela på andra webbplatser

Nu körde det ihop sig rejält. :) Dessa måste ju kopplas ihop med varandra. Den ena skriver ut själva databasen. Den andra skall visa ikonerna. Det komplicerade är nog inte att koppla ihop dessa två, utan snarare hur jag skall presentera det i DataGriden sist i koden... finns det någon lämplig lösning?

 

Sub Page_Load(obj As Object, e As EventArgs)
Dim objCmdThreads as new OleDbDataAdapter("SELECT * FROM Threads WHERE TopicID=" & Request.Querystring("channel") & " ORDER BY ThreadCreated DESC", objConn)

Try
dim ds as DataSet = new DataSet()
objCmdThreads.Fill(ds, "Threads")
MyDataList.DataSource = ds.Tables("Threads").DefaultView
MyDataList.DataBind()
Catch
lblErrorThreads.Text = "Databasen är tom!"
End Try
End Sub

 

Function ShowThreadIcon()
Dim objCmdPostIcon as new OleDbCommand("SELECT * FROM Threads WHERE TopicID=" & Request.Querystring("channel") & " ORDER BY ThreadCreated DESC", objConn)
Dim objReader As OleDbDataReader

objConn.Open
objReader = objCmdPostIcon.ExecuteReader
Dim strPostIcon As DateTime
While objReader.Read()
strPostIcon = objReader.GetDateTime(6).ToString("d")
If strPostIcon = Now.ToString("d") Then
Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/new_post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Ny tråd, nytt inlägg"" /><br />")
Else
Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Gammal tråd, gammalt inlägg"" /><br />")
End If

End While
objConn.Close

End Function

 

<asp:Label id="lblErrorThreads" runat="server" maintainstate="false" />
<asp:Repeater id="MyDataList" runat="server">
<ItemTemplate>
<tr>
<td class="rowLight" width="3%" height="20" align="center">
<% call ShowThreadIcon%>
</td>
<td class="rowLight" width="57%" height="20">
<a class="system" name="<%# DataBinder.Eval(Container.DataItem, "ThreadId") %>" href="viewthreads.aspx?thread=<%# DataBinder.Eval(Container.DataItem, "ThreadId") %>"><%# DataBinder.Eval(Container.DataItem, "ThreadTitle") %></a>
</td>
<td class="rowLight" width="15%" height="20">
<%# DataBinder.Eval(Container.DataItem, "ThreadWriter") %>
</td>
<td class="rowLight" width="15%" height="20">
<%# DataBinder.Eval(Container.DataItem, "ThreadCreated") %>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>

 

Med tillägg för det du just skrev. :)

 

MVH

// Kristofer Gisslén

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Jag har inte sysslat med ASP.net , utvecklar för Windows istället VB.Net), så jag är inte riktigt med på hur <asp:Repeater id="MyDataList" runat="server">

fungerar, så jag har inte något bra svar just nu (eller snarare inget svar alls =)

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Ok, jag tror jag förstår repeatern nu.

 

Om du ändrar <% call ShowThreadIcon%> till <% call ShowThreadIcon(DataBinder.Eval(Container.DataItem, "PostIcon").ToString) %>

 

och sen ändrar du din funktion till:

 

[log]

Function ShowThreadIcon(Byval strPostIcon As String)

 

If strPostIcon = Now.ToString("d") Then

Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/new_post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Ny tråd, nytt inlägg"" /><br />")

Else

Response.Write(strPostIcon & "<img src=""skin/eDiskus_default/post.gif"" width=""15"" height=""15"" border=""0"" align=""absmiddle"" alt=""Gammal tråd, gammalt inlägg"" /><br />")

End If

 

End Function

[/log]

 

...så har du en gissning iallafall.

 

[inlägget ändrat 2004-03-02 21:03:45 av Anjuna Moon]

Länk till kommentar
Dela på andra webbplatser

Jag tror att vi är lösningen på väg. :) Ursäkta att jag krånglar så, men nu säger kompileringen att 'Container' is not declared... :(

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Konstigt, Container är väl själva Repeatern självt? Funkar repeatern om du inte kallar på ikon-funktionen (dvs funkar Container.DataItem för övrigt i repeatern?)

 

Länk till kommentar
Dela på andra webbplatser

Yes. Den fungerar utmärkt i övrigt. Jag använder den för fullt för att visa de övriga fälten i tabellen, dvs. Trådens namn, trådens författare, tid då den skapades osv.

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Såg just att <%# måste användas vid databinding. Funkar det om du ändrar till:

 

<%# call ShowThreadIcon(DataBinder.Eval(Container.DataItem, "PostIcon").ToString()) %>

 

Länk till kommentar
Dela på andra webbplatser

Hmm... nä, nu säger den 'Expression missing' när jag lagt till #-tecknet framför call... Detsamma säger den om man placerar #-tecknet var som helst annars inom <% %>-taggarna.

 

Ursäkta: 'Expression expected' står det. :)

[inlägget ändrat 2004-03-02 21:39:30 av Coffer]

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Nu vet jag inte ut eller in =)

 

- Jag antar att du bytt ut "PostIcon" mot rätt fältnamn?

- Prövat att ta bort ToString()?

 

 

Länk till kommentar
Dela på andra webbplatser

Gissa om jag förstår något? :) Jag försöker verkligen att bena ut det här. Jag har ersatt PostIcon med det fältnamn som koden skall jämföra mot, nämligen "ThreadCreated". ToString() gör ingen skillnad i detta nu, då felet uppstår på ett tidigare plan. Det gjorde ingen skillnad att jag tog bort den. :(

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Får du veta vilket objekt som orsakar felet?

Testa även om det här gör ngn skillnad (och så ser du vilken rad som orsakar felet)

 

<%# dim a as object=DataBinder.Eval(Container.DataItem, "PostIcon")

dim b as string=a.toString()

call ShowThreadIcon(B)

%>

 

Länk till kommentar
Dela på andra webbplatser

Samma fel som tidigare. Den refererar till den här raden:

 

<%# dim a as object=DataBinder.Eval(Container.DataItem, "ThreadCreated")

 

Länk till kommentar
Dela på andra webbplatser

Jättetack för hjälpen. Det var inget lätt problem att lösa måste jag säga. :)

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...