這是我的文章備份,原文請看:
http://www.dotblogs.com.tw/mis2000lab/archive/2011/05/30/calendar_dayrender_personal_schedule_2011.aspx
這個範例,請您務必先完成另一個基礎,才能進行下去。
使用上一個範例的技巧
([習題]Calendar日曆控制項的.OnDayRender()方法與 DayRender事件),作法其實很雷同。
補充 ASP.NET 4.0 專題實務 / 松崗出版
「上集」第三章 的 日曆控制項範例
自己設計一個簡單的 Table,請參閱書本 ASP.NET 4.0 專題實務 / 松崗出版
「上集」第三章, Ch. 3-11-6:
1. 除了上述的範例(日曆控制項的 DayRender事件),您要先學會之外,
2. 另外要寫一些 ADO.NET程式(在此使用 DataReader來作)
程式執行結果:
01 |
'----自己(宣告)寫的---- |
02 |
Imports System |
03 |
Imports System.Web.Configuration |
04 |
Imports System.Data |
05 |
Imports System.Data.SqlClient |
06 |
'----自己(宣告)寫的---- |
07 |
08 |
09 |
10 |
Protected Sub calendar1_DayRender( ByVal sender As Object , ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles Calendar1.DayRender |
11 |
12 |
'=======微軟SDK文件的範本======= |
13 |
'----(連結資料庫)---- |
14 |
Dim Conn As New SqlConnection(WebConfigurationManager.ConnectionStrings( "事先寫在Web.Config檔裡面的連結字串" ).ConnectionString) |
15 |
Dim dr As SqlDataReader = Nothing |
16 |
Dim cmd As SqlCommand = New SqlCommand( "select * from Calendar_Schedule" , Conn) |
17 |
18 |
Try '==== 以下程式,只放「執行期間」的指令!===================== |
19 |
Conn.Open() '---- 這時候才連結DB |
20 |
21 |
dr = cmd.ExecuteReader() '---- 這時候執行SQL指令,取出資料 |
22 |
23 |
While dr.Read() |
24 |
Dim csTime As Date = FormatDateTime(dr( "cs_time" ), DateFormat.ShortDate) |
25 |
'*******************************************************(start) |
26 |
'-- Cell 屬性表示正在呈現的儲存格, |
27 |
'-- Day 屬性則表示要呈現在儲存格中的日期。 |
28 |
29 |
'--新增一個 Label控制項到日曆裡面的 cell。 |
30 |
If e.Day. Date = csTime Then |
31 |
32 |
'-- 出現一個 Label控制項。 |
33 |
Dim LB As New Label |
34 |
LB.Text = dr( "cs_title" ) |
35 |
36 |
e.Cell.Controls.Add(LB) |
37 |
End If |
38 |
'*******************************************************(end) |
39 |
End While |
40 |
41 |
Catch ex As Exception '---- 如果程式有錯誤或是例外狀況,將執行這一段 |
42 |
Response.Write( "<b>Error Message---- </b>" + ex.ToString()) |
43 |
44 |
Finally |
45 |
If Not (dr Is Nothing ) Then |
46 |
cmd.Cancel() |
47 |
'----關閉DataReader之前,一定要先「取消」SqlCommand |
49 |
dr.Close() |
50 |
End If |
51 |
If (Conn.State = ConnectionState.Open) Then |
52 |
Conn.Close() |
53 |
Conn.Dispose() '---- 一開始宣告有用到 New的,最後必須以 .Dispose()結束 |
54 |
End If |
55 |
End Try |
56 |
57 |
End Sub |
上面程式的缺點:
補充(一)......................................................................................................................................
缺點一:Calendar的 DayRender事件,是日曆上的「每一天」都會執行一次。
一個月有30天,就會重複執行 30次。 如此一來,就會重複開關資料庫 30之多。
如果您的DB裡面有 30筆記錄,上面的程式就會跑900次迴圈,很沒效率!
缺點二:SQL指令應該只抓取"當天"、或是"當月份"的資料即可。不要用 Select * from 資料表的寫法。
................................................................................................................................................................
這篇文章真難得,一天改了三次。
補充(二)
我們作業流程作了改變,(1). 程式碼就大幅減少了,而且(2). 程式執行的迴圈次數也大幅縮短。
簡單地說,未來改進的特點如下:
- 月曆控制項的 DayRender事件,在月曆控制項上面的當月份,「每一天」都會執行一次。如果一個月有 30天,本範例頂多只執行 30次而已。
- 每次 DayRender事件產生時,就拿即時產生的「那一天(也就是程式碼e.Day.Date)」去比對資料庫。那一天有行程,才在畫面上呈現出來。
................................................................................................................................................................
ADO.NET的程式是書本裡面, Ch. 14的 DataReader範本,也提供了C# 版本,您可以在書上找到。
唯一小小修正的部分,只有在 While 迴圈。
書裡的光碟,VB、C#都提供給您了,一魚兩吃!
==== 廣 告 ====================================================
很多人、很多書商,輕視這些基礎的、入門的 Web控制項,
但是我們真正寫程式,用最多的就是這些基礎控制項。
您對他越熟悉,基本功夫就會越穩固。
ASP.NET 4.0 專題實務 / 松崗出版
「上集」第三章
我就搜錄各種最常用的範例、程式碼,將近一百頁!
比較一下你手邊的書本,看看他提供什麼範例給你,
您就知道他是要教會你?還是隨便帶過去、混過去?
說不定,您手邊的入門書,連自己動手寫程式連結資料庫都 "沒有" 呢.....
這就是 ADO.NET程式...........
網頁上的補充範例(後續服務),不一定能立即提供 VB / C#語法(看我時間夠不夠寫,請不要跟我要)。
但書本上面的範例,一定有 VB / C#雙語法給您學習。
............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......
上集全新改寫。範例增加66%,內容增加35%。銷售半年,高達三刷!
下集(第二版,黑皮書)上市一個月熱銷再刷。2010一年內熱銷四刷! 下集內容增加66%。
上下兩集將近2,000頁,堪稱國內 [最詳盡]的ASP.NET範例教學。
............................. 寫信給我,mis2000lab (at) yahoo.com.台灣......
留言列表