07. maj 2007 - 18:25Der 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.
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.
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?
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.
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.
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.
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.
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å.
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.