Avatar billede tele_lucien Nybegynder
04. januar 2003 - 16:54 Der 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:
----------------------------------------------

<asp:TemplateColumn Visible="True">
<ItemTemplate>
    <%# CountPosts() %>
</ItemTemplate>
</asp:TemplateColumn>

Håber nogen kan hjælpe!

Mvh Lucien :-(
Avatar billede odegaard Nybegynder
04. januar 2003 - 17:27 #1
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.
Avatar billede tele_lucien Nybegynder
04. januar 2003 - 17:48 #2
Det lyder som en fed idé! Skal bare lige ha den skåret den ud i pap!

Og grunden til at den ligger i en TemplateColumn er fordi jeg bruger DataGrided.

Altså jeg har, min label her:

<asp:label id="Label1" runat="server" />

Og min kode skal så se ud?
Avatar billede burningice Nybegynder
04. januar 2003 - 17:55 #3
Page_Load() {
Label1.Text = CountPosts();
}
Avatar billede burningice Nybegynder
04. januar 2003 - 17:56 #4
eller bare

<asp:label id="Label1" runat="server" text='<%# CountPosts() %>' />
Avatar billede tele_lucien Nybegynder
04. januar 2003 - 18:06 #5
Den viser nul!

Har prøvet med:

Page_Load()
Label1.Text = CountPosts();

&

<asp:label id="Label1" runat="server" text='<%# CountPosts() %>' />

:-(

Det er in sql der noget galt med så!
Avatar billede tele_lucien Nybegynder
04. januar 2003 - 18:11 #6
Det kan da ikke passe at jeg ikke kan få det count P..!!!!!! Her til at virke.

Jeg giver ekstra points til den der vil hjælpe mig. Har siddet med det i mange timer,----- øv øv øv!

:-(
Avatar billede odegaard Nybegynder
04. januar 2003 - 19:29 #7
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 ?

Din SQL-streng ser ellers fin nok ud.
Avatar billede odegaard Nybegynder
04. januar 2003 - 19:31 #8
måske skulle jeg hellere spørge:
Hvad indeholder
CInt(System.Web.HttpContext.Current.Request.QueryString("ForumId"))
?

Altså efter konvertering til integer.
Det er også lidt pudsigt at du konverterer til integer for straks at konvertere tilbage til en streng igen :-)
Avatar billede tele_lucien Nybegynder
04. januar 2003 - 19:58 #9
Hej Odegaard

Grunden til at jeg bruger et Grid er fordi jeg har andre ting i det også.

Vil du set det? :-)

Så stik mig din mail adresse
Avatar billede tele_lucien Nybegynder
04. januar 2003 - 19:59 #10
BTW:

Min funktion ser nu således ud:

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

        Return CStr(Resultat)
    End Function
Avatar billede tele_lucien Nybegynder
04. januar 2003 - 20:00 #11
Og min label:

<asp:label id="Label1" runat="server" text='<%# CountPosts() %>' />
Avatar billede agony3 Nybegynder
05. januar 2003 - 00:33 #12
Hjalp ham over messenger. Hvis nogen vil se mit svar så snak med tele_lucien.
Avatar billede agony3 Nybegynder
05. januar 2003 - 00:34 #13
Public Function CountPosts(ByVal ForumId As String) As String
        Dim ForumID1 As String
        ForumID1 = System.Web.HttpContext.Current.Request.QueryString("ForumId")

<asp:label id="Label1" runat="server" text='<%# CountPosts(DataBinder.Eval(Container.DataItem, "ForumID")) %>' />
Avatar billede tele_lucien Nybegynder
05. januar 2003 - 00:37 #14
>> Agony3 hjalp mig!

Det virker nu!

Thanks :-)
Avatar billede odegaard Nybegynder
05. januar 2003 - 10:46 #15
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).
Avatar billede tele_lucien Nybegynder
05. januar 2003 - 13:21 #16
>> Odegaard

Hehe lappe-løsningen........

Jeg bliver da nød til at lave en funktion hvis jeg vil lave en count på bestemt række med forskellige ID?

Eller er det bare mig der sover her?!?!?!?.......

Vil du ikke komme med nogen kode eksempler på det du snakker om Odegaard?

Jeg er selvfølgelig meget interesseret i at se andre løsnings forslag.

Så skal jeg nok oprette et nyt spørgsmål, og give dig points.

Mvh Lucien
Avatar billede odegaard Nybegynder
05. januar 2003 - 13:37 #17
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
Avatar billede burningice Nybegynder
05. januar 2003 - 13:45 #18
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.
Avatar billede tele_lucien Nybegynder
05. januar 2003 - 13:55 #19
Okay..................

Over and out! ;-)
Avatar billede odegaard Nybegynder
05. januar 2003 - 14:03 #20
Cyberfessor: Det er du da ikke. Du har i designdelen nogle webcontrols, som du kan kalde og indsætte værdier i fra ItemOnDataBound.
Avatar billede burningice Nybegynder
05. januar 2003 - 14:15 #21
så du vil blankt indrømme at du aldrig har brugt databinding i designdelen i f.eks. en repeater?
Avatar billede tele_lucien Nybegynder
05. januar 2003 - 14:31 #22
Hehe..........

Kom så med det Odegaard......... ;-)

Har du det?
Avatar billede odegaard Nybegynder
05. januar 2003 - 16:58 #23
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!
Avatar billede tele_lucien Nybegynder
05. januar 2003 - 18:07 #24
Hvordan kan du sige at det er at smide kode ind i html delen når jeg binder CountPosts i en server kontrol?

Jeg syntes ikke det er at blande noget som helst, når alt funktionalitet ligger i en code-behind file.
Avatar billede odegaard Nybegynder
05. januar 2003 - 19:00 #25
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.
Avatar billede tele_lucien Nybegynder
05. januar 2003 - 19:15 #26
Okay.......

Det er der delte meninger om så.

Vil du ikke lige kigge på den her?

http://www.eksperten.dk/spm/301307
Avatar billede odegaard Nybegynder
05. januar 2003 - 19:40 #27
Nej, der er blot misforståelser :-)
Avatar billede burningice Nybegynder
05. januar 2003 - 21:01 #28
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester