04. januar 2003 - 16:54Der er
27 kommentarer og 1 løsning
En fed måde at lave en count function!
Hej med jer.....
Jeg har lavet et forum, hvor jeg vil lave en count på antal posts med et unikt FourmId da jeg har flere forskellige forums.
Jeg har lavet en funktion "CountPosts()", men det virker ikke.
Nogen fede forslag til hvordan man laver det?
Her er min funktion: ---------------------------------------------------------
Public Function CountPosts() As String Dim ForumID As Integer ForumID = CInt(System.Web.HttpContext.Current.Request.QueryString("ForumId"))
Dim strConnection As String = (Configuration.ConfigurationSettings.AppSettings("Autohuset")) Dim strSQL As String = "SELECT COUNT(*) FROM Posts WHERE ForumId = '" & ForumID.ToString & "'"
Dim objConnection As New SqlConnection(strConnection) Dim objCommand As New SqlCommand(strSQL, objConnection)
objConnection.Open()
Try Return CType(objCommand.ExecuteScalar(), String) Catch Throw Finally objConnection.Close() End Try End Function
---------------------------------------------- og sådan kalder jeg funktionen: ----------------------------------------------
Jeg forstår ikke lige hvorfor du vil have det ind i en TemplateColumn, og jeg tror ikke du kan kalde funktioner direkte inde fra templaten. Jeg ville smide sådan en enkelt-stående værdi i fx. en <asp:label id=minLabel/> og så sætte minLabel.Text=CountPosts().ToString()
Hvis det er fordi du vil have den i et datagrid, så skal det vel være en unik værdi for hver række; dvs. et tal pr forum?
I så fald skal du benytte en smartere SQL, eller gøre det i OnItemDataBound-eventet.
Jeg forstår ikke hvorfor du bruger et grid. Det er jo ikke tabel-data du vil vise (medmindre du vil vise det samme tal hele vejen ned igennem rækkerne).
Mht. din SQL: Er det ID en streng (eftersom det bliver sat i apostroffer)? Det virker lidt uhensigtsmæssigt at bruge en tekststreng som ID, når det nu er et tal.
Hvad indeholder 'System.Web.HttpContext.Current.Request.QueryString("ForumId"))' ? Er du sikker på at dette forumid eksisterer i Posts ?
Public Function CountPosts() As String Dim ForumID As String = System.Web.HttpContext.Current.Request.QueryString("ForumId")
Dim strConnection As String = (Configuration.ConfigurationSettings.AppSettings("Autohuset")) Dim strSQL As String = "SELECT COUNT(*) AS Antal FROM Posts WHERE ForumId = '" & ForumID & "'"
Dim objConnection As New SqlConnection(strConnection) Dim objCommand As New SqlCommand(strSQL, objConnection)
Dim Resultat As Integer = 0
Try objConnection.Open() Resultat = CInt(objCommand.ExecuteScalar()) Catch Ex As Exception System.Web.HttpContext.Current.Response.Write(Ex.Message) Finally objConnection.Close() objConnection.Dispose() End Try
Public Function CountPosts(ByVal ForumId As String) As String Dim ForumID1 As String ForumID1 = System.Web.HttpContext.Current.Request.QueryString("ForumId")
Jeg fatter ikke hvorfor du gør det på så besværlig en måde. Det er hundrede gange nemmere at indbygge det i det dataset som du binder til datagrid'et, eller benytter OnItemDataBound. Det er jo hele meningen, istedet for lappe-løsningen (hvis det er den du har holdt fast i).
Jeg gider ikke til at skrive eksempler, men jeg synes blot ikke at det er en særlig køn løsning at lave kode-kald nede i design-delen. Det bør kun forekomme i selve koden. Det er her OnItemDataBound kommer ind i billedet
odegaard>> tjaa... jeg synes nu ikke at løsningen er helt dum... det er jo det man har databinding til... hvis du ikke vil lave kodekald i designdelen, er du lidt afskåret fra at bruge databinding.
Selvfølgelig bruger jeg da databinding. Men jeg kalder ikke mine funktioner og procedurer fra designdelen. Hvis det er fordi jeg vil indsætte en værdi her, indsætter jeg en reference til datasættet, eller placerer en webcontrol som jeg kan referere til i OnItemDataBound. Repeatere og DataGrids er skam flittig brugt.
Hele problemet med gammel asp ligger jo blandt i rodet med html og kode. Så når man endelig får mulighed for at slippe for det, er det jo ikke meningen at man stadig skal stoppe alle sine funktioner osv. nede i design-delen. Det er dårlig kode, som er et helvede at rydde op i/opdatere/udvide/forstå osv.
F.eks. hvis du ændrer på definitionen på CountPosts(), så ved du også at det er i koden du skal lave kode-ændringer, og IKKE i designet!
Databinding handler om at binde DATA til et objekt. Data er f.eks. et variabel, datasæt, datatable, array osv. Når man binder data, benytter man DataBind() ! Dvs. du har f.eks. et datasæt som du binder til en webcontrol. Det er jo langt fra hvad du gør.
odegaard>> om man bruger en funktion eller en variabel kan være ligegyldigt... om du skriver <%#DataBinder.Eval(Container.DataItem, "Antal") %> som henviser til værdien Antal i den container man har valgt at binde til objectet, eller CountPosts(DataBinder.Eval(Container.DataItem, "ForumID")) kan være underordnet... man blander kode og design sammen i begge eksempler.. basta... værdien Antal kan jo ligeså godt ændre sig, som funktionsnavnet CountPosts() og så skal der ændres i design i begge eksempler.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.