icaaqMedlem sedan okt. 20005 273 inlägg 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]
OK, här kommer mina funderingar :)
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
if (dteDate.DayOfWeek == 0)
{
strColor = "Peachpuff";
}
else if(dteDate.Date == System.DateTime.Today)
{
strColor = "LightSteelBlue";
}
else
{
strColor = "White";
}
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
NETworkMedlem sedan juni 20011 732 inlägg 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:
http://samples.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/table/doc_table.aspx
NETworkMedlem sedan juni 20011 732 inlägg icaaqMedlem sedan okt. 20005 273 inlägg Tack
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 ;)
icaaqMedlem sedan okt. 20005 273 inlägg
NETwork skrev:
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å:
Kalender: http://samples.gotdotnet.com/quickstart/aspplus/samples/webforms/ctrlref/webctrl/Calendar/VB/Calendar5.aspx
Kod: http://samples.gotdotnet.com/quickstart/util/srcview.aspx?path=/quickstart/aspplus/samples/webforms/ctrlref/webctrl/Calendar/Calendar5.src&file=CS\calendar5.aspx&font=3
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.
icaaqMedlem sedan okt. 20005 273 inlägg Ok nu har jag möblerat om lite :) Och jag kommer att studera länken om tabellbygnationen under dagen.
Men ni kan väl kolla vad jag gjort så länge:
[red]
void doMyCalender()
{
// Testar att göra en kalender
DateTime dteDate = DateTime.Now.Date;
CultureInfo cultSwe = new CultureInfo("sv-SE");
if (Request.QueryString["dteDate"] != null)
{
dteDate = Convert.ToDateTime(Request.QueryString["dteDate"]);
}
int intDaysInMonth = DateTime.DaysInMonth(dteDate.Year, dteDate.Month);
// Börjar att bygga en tabel.
Response.Write("<Table id=\"Table1\" cellSpacing=\"0\" cellPadding=\"3\" width=\"300\" border=\"1\">\n");
Response.Write("<TR><TD colspan=\"3\">");
Response.Write(dteDate.ToString("y"));
doLinks(dteDate);
Response.Write("</TD>");
string strColor;
DateTime dteDay = new DateTime(dteDate.Year, dteDate.Month, 1);
int i = 0;
do
{
if (dteDay.DayOfWeek == 0)
{
strColor = "Peachpuff";
}
else if(dteDay.Date == System.DateTime.Today)
{
strColor = "LightSteelBlue";
}
else
{
strColor = "White";
}
Response.Write ("<TR bgColor=\""+strColor+"\">\n");
Response.Write ("<TD Width=\"10%\">" + dteDay.ToString("dd", cultSwe)+"</TD><TD Width=\"90%\">"+ dteDay.ToString("dddd", cultSwe) +"</TD>");
Response.Write ("</TR>\n");
i ++;
dteDay = dteDay.AddDays(1);
}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]
Nu börjar det bli roligt :e