Avatar billede mortenbock Nybegynder
07. maj 2007 - 18:25 Der er 9 kommentarer og
2 løsninger

Hurtig fyldning af Calendar Control

Hejsa.

Jeg har lige brug for lidt input omkring hvad der er den hurtigste måde at udføre nedenstående på. Det er noget som kommer til at ske rigtig meget, så derfor er det vigtigt at serverbelastningen er så lille som mulig.

Jeg har en tabel i min database med ca 100.000 rækker. Der er tre kolonner: UserID, Dato, status

På min side har jeg en calendar control som skal markere datoer for en given bruger i en given måned. Farven på datoen afhænger af kolonne "status"

Data skal hentes fra databasen hver gang der er et postback, da det er vigtigt at dataene er helt opdateret.

Mit eget forslag til den hurtigste måde at løse det er

1: En datareader til at hente rækkerne
2: Fyld rækkerne i en datatable
3: I calendar_dayrender funktionen looper man igennem datatable objektet, og markere datoen hvis den findes i tabellen.

Kan det gøre hurtigere?
Avatar billede driis Nybegynder
07. maj 2007 - 18:39 #1
Sørg for at begrænse SQL udtrykket så det kun returnerer datoer der er inden for det range, som kalenderen skal rendere.

Jeg ville nok loope gennem tabellen én gang og markere de datoer; der findes - I stedet for at gå gennem tabellen hver gang du renderer en dag. På den måde slipper du med omtrentligt 30 gange færre instruktioner.
Avatar billede dr_chaos Nybegynder
07. maj 2007 - 18:55 #2
Jeg ville nok droppe datatabellen og bare gennemløbe readeren og markerer tabellen der.
Avatar billede mortenbock Nybegynder
07. maj 2007 - 19:08 #3
driis > Hvordan vil du gøre det uden at bruge dayrender metoden? Kan man markere en dato uden for dayrender metoden? Vil gerne se et eksempel hvis du har det?

dr_Chaos> Jeg bruger tre lag i min app, og vil klart foretrække at få lukket forbindelsen nede i mit DAL. Og jeg kan vel ikke bruge readeren til noget efter jeg har lukket forbindelsen?
Avatar billede dr_chaos Nybegynder
07. maj 2007 - 19:25 #4
Du kan bruge Calendar1.SelectedDates.Add(DateTime dt);
Til at tilføje de datoer som skal vælges.
I stedet for en datatable kan du evt returnerer List<DateTime> og gennemløbe den for at sætte selecteddates.
På den måde skal du ikke type caste.
Avatar billede driis Nybegynder
07. maj 2007 - 19:25 #5
Jeg ved ikke om man kan markere en dato uden for dayrender metoden. Men hvis man ikke kan, kunne du jo passende smide dine datoer i en Dictionary. Så er omkostningen per opslag ikke så stort.
Avatar billede mortenbock Nybegynder
07. maj 2007 - 19:38 #6
dr_chaos> Der kan kun være én selecteddate i kalenderen, da jeg udfører handlinger baseret på den dato som brugeren har valgt, og det gøres i dayrender metoden. Men jeg vil kigge på om jeg evt. kan bruge en List i stedet for en datatable. Smid et svar, så får I begge point for jeres forslag :-)

driis> Jeg vil også kigge på Dictionary forslaget.
Avatar billede dr_chaos Nybegynder
08. maj 2007 - 09:33 #7
svar :)
du kan også sætte
Calendar1.SelectedDate = DateTime.Now;
og derefter lave din handling.
Men det kommer meget an på hvordan din dayrender metode ser ud.
Avatar billede mortenbock Nybegynder
08. maj 2007 - 09:46 #8
dr_chaos> Min dayrender metode er noget a'la

if(e.Day.IsSelected){
//Kode til at markere datoen i databasen
MarkDate(Calendar1.SelectedDate);
Calendar1.SelectedDates.Clear();
}

Og så skal den så udvides med noget a'la

Hvis d.Day er i min datatable
  Sæt passende class attribut og marker datoen med CSS
Avatar billede dr_chaos Nybegynder
08. maj 2007 - 10:32 #9
Kan du ikke bare bruge:
Calendar1.SelectedDayStyle.CssClass= "dincssclass";
Avatar billede mortenbock Nybegynder
08. maj 2007 - 11:58 #10
Jeg skal næsten forklare hele scenariet for at det giver mening :-)

Jeg har som sagt en række datoer som skal vises i kalenderen.

F.eks. kan en dato være markeret med status = 1 i databasen, og vil så blive vist med rød i kalenderen.

Når jeg så klikker på den dato, så skal den markeres i databasen som status = 2 og vises med gul i kalenderen. Og når jeg klikker igen på samme dato får den status = 3 og markeres med grøn i kalenderen.

Derfor kan jeg ikke benytte "selecteddate" til layout, da jeg har brug for propertien til at finde ud af hvilken dato brugeren har klikket på.
Avatar billede dr_chaos Nybegynder
08. maj 2007 - 13:33 #11
Ok det giver god mening.
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

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