Nu har jag gjort en kalender som jag ska använda till en sorts dagbok :)
Nu vill jag att ni här på wF ska granska den i detalj och komma med synpunkter på hur ni kanske hade gjort
Varsogoda:
[red]
void doMyCalender()
{
DateTime dteDate = DateTime.Now.Date;
if (Request.QueryString["dteDate"] != "")
{
dteDate = Convert.ToDateTime(Request.QueryString["dteDate"]);
}
// Testar att göra en kalender
int intDaysInMonth = DateTime.DaysInMonth(dteDate.Year, dteDate.Month);
CultureInfo cultSwe = new CultureInfo("sv-SE");
// Börjar att bygga en table
Response.Write ("<Table id=\"Table1\" cellSpacing=\"0\" cellPadding=\"3\" width=\"300\" border=\"1\">\n" +
"<TR><TD colspan=\"3\">"+ dteDate.ToString("y"));
doLinks(dteDate);
Response.Write("</TD>");
int i = 1;
do
{
dteDate =new DateTime(dteDate.Year, dteDate.Month, i);
string strColor;
if (dteDate.DayOfWeek.ToString("d") == "0")
{
strColor = "Peachpuff";
}
else if(dteDate.Date.ToString() == System.DateTime.Today.ToString())
{
strColor = "LightSteelBlue";
}
else
{
strColor = "White";
}
Response.Write ("<TR bgColor=\""+strColor+"\">\n");
Response.Write ("<TD Width=\"10%\">" + dteDate.ToString("dd", cultSwe)+"</TD><TD Width=\"90%\">"+ dteDate.ToString("dddd", cultSwe) +"</TD>");
Response.Write ("</TR>\n");
i ++;
}while (i <= intDaysInMonth);
Response.Write ("</Table>");
}
public void doLinks(DateTime dteDate)
{
Response.Write("<a href=\"default.aspx?dteDate="+dteDate.AddMonths(-1)+ "\" alt=\""+dteDate.AddMonths(-1)+ "\">«</a> <a href=\"default.aspx?dteDate="+dteDate.AddMonths(1)+ "\">»</a>");
}
[/red]
Prestandamässigt är det bättre att inte allokera så mycket på heapen som du gör. Tänk på följande:
1. Återanvänd samma kopia av cultSwe. Lägg cultSwe som en statisk medlemsvariabel eller på något annat bra ställe så den inte skapas om hela tiden. Som du gör nu kommer du skapa ett sådant objekt ca 30 gånger för att skriva ut en kalender. Åtminstone borde du skapa den på bara 1 ställe överst i din funktion.
2. Samma sak med dteDate, där gör du också ca 30 allokeringar på heapen som inte är nödvändiga. Skapa dteDate ovanför do-slingan. Sedan gör du AddDays(1) sist i loopen istället.
3. Du jämför datum som strängar i if-satsen. Gör istället
4. Inom Response.Write loopen gör du en flera gånger sträng-sammanslagningar. Det kommer att innebära allokeringar av System.String som du kan undvika. Gör istället Response.Write flera gånger eftersom ett funktionsanrop har lägre kostnad än allokering. Läs punkt 7 i http://samples.gotdotnet.com/quickstart/aspplus/doc/perftuning.aspx
Det gör ont i mitt .net-hjärta när jag ser hur du bygger upp tabellen med response.write. ;) Titta på det här exemplet så får du ett tips på hur du ska göra:
Sedan kan man ju förstås fråga sig varför du inte använder dig av den inbyggda kalenderkontrollen... där finns ju alla funktioner du behöver färdiga att användas och mer ändå:
2. Samma sak med dteDate, där gör du också ca 30 allokeringar på heapen som inte är nödvändiga. Skapa dteDate ovanför do-slingan. Sedan gör du AddDays(1) sist i loopen istället.
Hur ska jag då skriva vid while?
NETwork--- Jag ska kolla in det där och återkommer sen med resultat ;)
Sedan kan man ju förstås fråga sig varför du inte använder dig av den inbyggda kalenderkontrollen... där finns ju alla funktioner du behöver färdiga att användas och mer ändå:
För jag vill inte ha en sån modell ;) Skämt ossidå så kommer jag nog att använda en sådan senare, men för att jag ska lära mig detta nån gång testade jag att göra en egen.