Avatar billede jesperwerge Nybegynder
14. maj 2007 - 16:13 Der er 34 kommentarer og
1 løsning

Opdatering hvert 3 sekund script, hjælp er nødvendigt

hej Eksperter,

jeg har jeg lavet en almindelig ASP.NET side, som er AJAX enabled, her benytter jeg en timer og et updatePanel for at kunne opdatere en label dynamisk hvert 3 sekund.

kode:
<form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <asp:Timer ID="Timer1" runat="server" Interval="3000" OnTick="Timer1_Tick" OnLoad="Timer1_Tick">
            </asp:Timer>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Timer1" />
                </Triggers>
                <ContentTemplate>
                    <asp:Label ID="lblCitat" runat="server" CssClass="citater" />
                </ContentTemplate>
            </asp:UpdatePanel>
            &nbsp;
        </div>
    </form>

så har jeg noget behindpage kode der kalder en klasse der returnerer en tekststreng, koden er:

Citat myStatement = new Citat();
lblCitat.Text = myStatement.GetCitat();

Klassen benytter et DataSet hvor jeg har lave ten slect statement, som benytter sig af rnd() funktionen på en Access DB, koden:

DataSet1TableAdapters.QueriesTableAdapter myQuery = new DataSet1TableAdapters.QueriesTableAdapter();
string myStatement = myQuery.SelectNextCitat().ToString();
return myStatement;

når jeg tester DataSettet får jeg en ny random valgt tekst, men når jeg bruger kode på sitet får jeg kun den samme tekst tilbage.

er der nogen der har en ide til hvorfor?
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 16:14 #1
PS. jeg kan se at siden opdateres hvert 3 sekundt, men der er altid samme tekst.
Avatar billede neoman Novice
14. maj 2007 - 16:25 #2
Hvor kalder du Citat myStatement = new Citat();
lblCitat.Text = myStatement.GetCitat(); ?

Jeg har på fornemmelsen du har koden liggende inde i NOT page.IsPostBack, og det er nok derfor den kun kaldes en gang, og de efterfølgende postbacks displayer blot  den gamle label, som ikke er blevet fornyet :)
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 16:43 #3
Hej neoman

ja jeg kalder myStatement.GetCitat() direkte på label.

jeg denne kode liggende på min behind code page til min ASPx fil:

jeg har lavet en event handler til at trigge koden:

public void Timer1_Tick(object s, EventArgs e)
    {
        Citat myStatement = new Citat();
        lblCitat.Text = myStatement.GetCitat();
    }
Avatar billede neoman Novice
14. maj 2007 - 16:46 #4
Ok - jeg har ikke helt styr på hvordan det virker med timeren - men har du checket at du faktisk kommer forbi dit timer-event ? Ellers kunne  du bare flytte linjerne op i PageLoad, som jo alligevel kører hver gang siden reloades (partielt eller ej, og uanset årsag)
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 16:47 #5
ahh lad mig lige forklare igen:

på min timer har jeg en onTick="Timer_Tick" og onLoad="Timer_Tick" - hvert 3 sekund trigger den dette event. så på den måde får jeg trigget mit behind code.

/werge
Avatar billede neoman Novice
14. maj 2007 - 16:51 #6
Ja fint nok - men der sker et eller andet så du enten ikke kommer forbi din eventhandler og fornyer lablen, eller den får en gammel værdi efterfølgende - det kan jeg ikke se uden at se hele koden. Mit forslag er at glemme din timer-event handler, og blot lægge
      Citat myStatement = new Citat();
        lblCitat.Text = myStatement.GetCitat();
op i PageLoad - fordi den kører hver gang timeren trigger en postback.
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 16:52 #7
det giver samme resulatat såfremt koden ligger i Page_Load() - desværre
Avatar billede neoman Novice
14. maj 2007 - 16:56 #8
huh ? altså

  Citat myStatement = new Citat();
        lblCitat.Text = myStatement.GetCitat();
ligger direkte i pageload uden noget !Page.IsPostBack udenom og det virker ikke ??? mystisk
Avatar billede neoman Novice
14. maj 2007 - 16:57 #9
ok. Dit data set - læser du det også ind for hver postback ? og din random number starter med samme seed ? så får du jo det samme , fordi det er ikke heeelt random jo ! :-)
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 17:03 #10
øhh der er jeg nok lige lidt bagud, samme seed? Jeg udfører en ny citat() kald hvergang, som jeg troede ville give mig et nyt object at arbejde med, hvordan virker det der seed og hvad er det ?
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 17:08 #11
ahh - jeg skal selv sørge for at der er et nyt seed hvergang? skal man vide indenfor hvilke antal man skal starte imellem?

f.eks. hvis jeg kun har 10 række i DB, skal jeg så finde et nyt seed inden for 1 til 10?
Avatar billede neoman Novice
14. maj 2007 - 17:09 #12
Jeg her ikke helt fattet hvordan du gør - men et random number er jo ikke helt random, i og med at du får det samme nummer hver gang du kalder funktionen, medmindre den husker hvor langt du er nået, eller at du fodrer den med en forskellig "seed"  fra gang til gang, så random number generatoren kan starte et andet sted - slå den op i access hjælp.

men problemet kan ligge et andet sted:
du bruger  en SelectNextCitat() funktion - hvordan husker den hvor langt den er nået fra den ene postback til den næste ?

Paste hele din kode ind her, for ellers kan vi gætte fra nu af og til dommedag :)
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 17:26 #13
hej
troede jeg havde hele koden med. men jeg skriver den igen , tak fordi du vil hjælpe.

testmail.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="mainTest.aspx.cs" Inherits="mainTest" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <link href="styleSheet.css" rel="stylesheet" type="text/css" />
    <title>ingen titel</title>
</head>
<body>
<form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <asp:Timer ID="Timer1" runat="server" Interval="3000" OnTick="Timer1_Tick" OnLoad="Timer1_Tick">
            </asp:Timer>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Timer1" />
                </Triggers>
                <ContentTemplate>
                    <asp:Label ID="lblCitat" runat="server" CssClass="citater" />
                </ContentTemplate>
            </asp:UpdatePanel>
            &nbsp;
        </div>
    </form>
</body>
</html>

code Behind fil maintest.aspx.cs:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class mainTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    public void Timer1_Tick(object s, EventArgs e)
    {
        Citat myStatement = new Citat();
        lblCitat.Text = myStatement.GetCitat();
    }
}

citat.cs klasse:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for Citat
/// </summary>
public class Citat
{
    public string GetCitat()
    {
        DataSet1TableAdapters.QueriesTableAdapter myQuery = new DataSet1TableAdapters.QueriesTableAdapter();
        string myStatement = myQuery.SelectNextCitat().ToString();
        return myStatement;
    }
}

DataSet SQL statement:

SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd([AutoID])

Det er det hele, eller mangler jeg noget?

/werge
Avatar billede neoman Novice
14. maj 2007 - 17:39 #14
1. Jeg er ikke overbevist om, at SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd([AutoID]) vil give forskellige resultater fra gang til gang siden din AutoID ændrer sig ikke - vel ?  Men det kunne du jo teste.

2.Hvordan ser funktionen SelectNextCitat() ud ? Rent umiddelbart så skal den jo huske hvor langt den er.

3. Hvis du kun selecter TOP 1, så er der jo kun et citat i datasettet, så hvad gør selectnextcitat ?
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 17:46 #15
SelectNextCitat() bruger SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd([AutoID]) til at returnere en tekst. når jeg laver et preview i mit dataSet på denne "funktion" virker det perfekt. det er korrekt at man kan få returneret samme statement x antal gange efter hinanden, men det er ok.

/werge
Avatar billede neoman Novice
14. maj 2007 - 17:53 #16
Ok - jeg troede det var din get/fill som var Select tOP 1 ....

Ja ok - men så er det din selectnextcitat jo som altid finder det samme frem.

Jeg ville modificere din SelectNextCitat til SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd([?]), hvor parameteren  kunne f.eks. være Now.Second - dvs den skulle kaldes med
SelectNextCitat(Now.Second) - så får den da noget forskelligt fra gang til gang
Avatar billede neoman Novice
14. maj 2007 - 17:55 #17
hehe det vil jo ikke virke .. 10 sec.. ska li tænke lidt
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 18:04 #18
det er testet, og jeg får samme resulatat :)

det er lidt underligt eller hva?
Avatar billede neoman Novice
14. maj 2007 - 18:07 #19
Ok har li testet - hvis jeg lukker DB en ned o åbner og kører en queery magen til din, så får jeg det samme tal ud som random - ganske som jeg mistænkte...

Jeg vil foreslå at din select har en random komponent som f.eks. sekunder eller som kan fremskaffe forskellieg resultater
så f.eks.
SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd(Minute(Now)) elel noget i den stil - ved ikke om du kan få fat i sekunder
Avatar billede neoman Novice
14. maj 2007 - 18:11 #20
ja ok - du brude kunne indsætte rnd(second(now)) så din selectnextcitat er uændret (altså uden noen parametre) og din select ser sådan ud :
SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd(Second(Now))
Avatar billede neoman Novice
14. maj 2007 - 18:14 #21
hehe . ogdet virker heller ikke, fordi alle records får samme tal .. grrrr :)
Avatar billede neoman Novice
14. maj 2007 - 18:17 #22
ok got it .... Rnd(Second(Now)+AutoID) men AutoID skal nok lige normaliseres lidt eller noget, ellers ryger du out of range for random funktionen formentligt.
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 18:17 #23
Det giver ingen forskel.

måske selve sidne skla have en bestemt opsætning for at dette er muligt?
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 18:20 #24
har ikke testet det sidste øjeblik :) - du er jo hurtigt til forslag :)
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 18:24 #25
den vælger det samme record hvergang :(
Avatar billede neoman Novice
14. maj 2007 - 18:28 #26
så du har
SELECT TOP 1 StatementText,AutoID FROM statements ORDER BY Rnd(Second(Now)+AutoID)
og
string myStatement = myQuery.SelectNextCitat().ToString();

og disse to tilsammen giver altid den samme record ?
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 18:31 #27
ja ????
Avatar billede neoman Novice
14. maj 2007 - 18:32 #28
Jeg tror i øvrigt at det er en ret dyr måde, ressourcemæssigt, at få noget frem på.
Et alternativ ville være følgende (afh af hvor mange citater du har jo):

1. Læs citaterne ind i datasettet
2. Gem datasettet i session (eller Application, da alle brugere vel tilgår samme dataset)
3. Find en random record i settet - du ved hvor mange records det indeholder, så man skal blot hive en tilfældig record ud (simelthen via dens position i datasettet) :)
Avatar billede neoman Novice
14. maj 2007 - 18:34 #29
Jeg ved ikke hvorfor det ikke funker. det kunne være sjovt at få det til at køre, meen livet er for kort til at sidde fast. Vil du overveje den alternative fremgangsmåde måske ? :-)
Avatar billede jesperwerge Nybegynder
14. maj 2007 - 18:35 #30
tja det er også en muligthed, jeg vil lige se om jeg kan få det til at virke, jeg vender lige tilbage, så du kan få lidt points, hvis dette lykkes :)

/werge
Avatar billede jesperwerge Nybegynder
17. maj 2007 - 10:44 #31
Hej neoman

ked af at jeg ikke har vendt tilbage før nu, men jeg har først haft mulighed for at se på det igen her til formiddag.

løsningen blev som du beskriv med et DataSet og random vælg ud fra dette.

koden blev ganske simple:

DataSet1TableAdapters.QueriesTableAdapter myQuery = new DataSet1TableAdapters.QueriesTableAdapter();
int count = int.Parse(myQuery.CountOf().ToString());
DataSet1TableAdapters.statements1TableAdapter myTable = new DataSet1TableAdapters.statements1TableAdapter();
Random myRandomNo = new Random();
int myRan = myRandomNo.Next(0, count);
string myStatement = myTable.GetRandomStatementTable().Rows[myRan]["StatementText"].ToString();
return myStatement;

tak for hjælpen, giver du lige et svar så du kan få point.

/werge
Avatar billede neoman Novice
17. maj 2007 - 12:09 #32
Godt det virker. Nu ved jeg ikke hvor meget trafik du forventer på din site, men den måde at gøre det på er meget "heavy duty" - nyt dataset hvert 3 sekund for hver bruger, læse alle rækkerne, og vælge een ud.

i VB (er ikke så go til C#) ville jeg nok gøre sådan noget :

If NOT IsNothing (Session("CitatCount")) Then

Else
End IF
Avatar billede neoman Novice
17. maj 2007 - 12:15 #33
If NOT IsNothing (Session("CitatCount")) Then
  count = CINT(CTYPE(Session("CitatCount"),String))  = int.Parse(myQuery.CountOf().ToString())
myTable = CTYPE(Session("myTable"), DataSet1.statements1Table)

Else
Session("CitatCount") = int.Parse(myQuery.CountOf().ToString())
Session("myTable") = myTable
End IF

så bliver tabellen kun hentet een gang per session  - dette dog for hevr bruger.
Hvis du erstatter "Session" med "Application" - så bliver tabellen hentet fra DB'en een gang - den første gang en bruger kommer ind på sitet, og alle andre brugere henter data fra datasettet fra Application.
Avatar billede neoman Novice
17. maj 2007 - 12:19 #34
If NOT IsNothing (Session("CitatCount")) Then
  count = CINT(CTYPE(Session("CitatCount"),String))  = int.Parse(myQuery.CountOf().ToString())
myTable = CTYPE(Session("myTable"), DataSet1.statements1Table)

Else
  dim myTable as DataSet1. statements1Table = new    DataSet1TableAdapters.statements1TableAdapter()
  Session("CitatCount") = int.Parse(myQuery.CountOf().ToString())
  Session("myTable") = myTable
End IF
Avatar billede jesperwerge Nybegynder
17. maj 2007 - 12:43 #35
Hej

der er en del brugere af sitet, i perioder, men det stiger støt, så det er nok en ret god ide du kommer med her, jeg vil se nærmere ind til det.

du skal have rigtig meget tak for din hjælp og hints. det er alletiders.

/werge
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