2007-11-14

Turn on WebBrowser design mode

First,  參考 Microsoft HTML Object Library
 
WB=WebBrowser
 
WB.DocumentText = "<html><body></body></html>"
  Dim doc As IHTMLDocument2 = WB.Document.DomDocument
  doc.designMode = "On"     ->Intelligence不會show出這個屬性, 應該是微軟刻意隱藏起來

2007-11-10

SCOPE_IDENTITY、IDENT_CURRENT and @@IDENTITY

SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY 是類似的函數,因為它們會傳回插入識別資料行的值。
IDENT_CURRENT 不受範圍和工作階段的限制;它只限於指定的資料表。IDENT_CURRENT 會傳回在任何工作階段和任何範圍中,產生給特定資料表的值。
SCOPE_IDENTITY 和 @@IDENTITY 會傳回目前工作階段任何資料表中所產生的最後一個識別值。不過,SCOPE_IDENTITY 會傳回只在目前範圍內插入的值;@@IDENTITY 不限於特定範圍。
例如,有 T1 和 T2 兩份資料表,T1 定義了 INSERT 觸發程序。當資料列插入T1 時,會引發觸發程序,且會在 T2 中插入一個資料列。這個狀況說明兩個範圍:在 T1 插入,以及觸發程序在 T2 插入。
假設 T1 和 T2 都有識別資料行,在 T1 的 INSERT 陳述式結束時,@@IDENTITY 和 SCOPE_IDENTITY 會傳回不同的值。@@IDENTITY 會傳回在目前工作階段中,跨越任何範圍所插入的最後一個識別資料行值。這是在 T2中插入的值。SCOPE_IDENTITY() 會傳回在 T1 中插入的 IDENTITY 值。這是相同範圍內所發生的最後一項插入。如果在範圍內的識別資料行執行任何 INSERT 陳述式之前叫用 SCOPE_IDENTITY() 函數,這個函數會傳回 Null 值。
失敗的陳述式和交易可能會變更資料表的目前識別,以及建立識別資料行值中的間距。識別值永遠不會回復,即使試圖將值插入資料表的交易未獲認可,也是如此。例如,如果 INSERT 陳述式因 IGNORE_DUP_KEY 違規而失敗,資料表的目前識別值仍會遞增。

資料庫有開啟複寫功能的要使用SCOPE_IDENTITY 才能傳回正確的值

2007-11-08

動態新增控制項與 ViewState

在 Page Init 事件中動態建立的控制項有辨法自行維護狀態,因為這些控制項在 PostBack 後會執行 LoadViewState 來還原控制項的狀態。不過我們來看一個案例,首先在頁面上放置一個 Button 做 PostBack 使用,然後在程式碼中 Page Init 事件中動態建立一個 Literal 控制項,並在頁面第一次執行時(判斷 Not IsPostBack) 設定 Literal.Text 初始值,然後把這個 Literal 控制項加入頁面。
    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        Dim oLiteral As New Literal()
        If Not Me.IsPostBack Then
            oLiteral.Text = "初始值"
        End If
        Me.Form.Controls.Add(oLiteral)
    End Sub
在上面的程式碼中,在面頁第一次執行時設定 Literal 的 Text 屬性值, 而按鈕 PostBack 後,理論上應該會由 ViewState 還原 Literal 的 Text 屬性值。可是實際執行時會發現,當 PostBack 時 Literal 的 Text 值不見了??
針對上面的問題,將程式碼做如下小修改,就是將 Literal 控制項加入頁面的動作往上移至設定 Literal 的 Text 屬性值之前。
    Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        Dim oLiteral As New Literal()
        Me.Form.Controls.Add(oLiteral)
        If Not Me.IsPostBack Then
            oLiteral.Text = "初始值"
        End If
    End Sub
重新執行程式,你會發覺竟然按鈕 PostBack 後,Literal 的 Text 屬性值會被保留了。
為什麼會發生這種情形呢?這是因為 Literal 的 Text 屬性是直接存取 ViewState 的原因,當動態新增的控制項未被加入頁面中時,控制項本身是無法存取 ViewState 時,所以動態新增的 Literal 控制項,在未加入執行 Me.Form.Controls.Add(oLiteral) 加入頁面前,設定它的 Text 屬性值,是無法被存入 ViewState 中,也就導致為什麼 PostBack 時,Literal 的 Text 屬性值不會被保留的原因了。
所以結論是,動態建立的控制項,最好馬上執行 Controls.Add 先加入頁面中,再去設定它的相關屬性值,才不會發生設定的屬性值無法寫入 ViewState 的情形。

2007-11-07

動態新增User Control

WebUserControl MyControl = (WebUserControl)LoadControl("WebUserControl.ascx");
可是你會發現 VS.NET 的 IntelliSense 好像不認得我們的UserControl
按 [Control] + [J] 翻來翻去就是找不到我們的 UserControl
是因為ASP.Net2.0是用多組件 動態編譯而成 跟1.1都編譯在同一個組件不同
所以我們參考不到
雖然硬寫,也會過, 但如果你要參考UserControl時 其實可以 在 aspx 的頁面加上
<%@ Reference Control="~/WebUserControl.ascx" %>即可, 這時在 IDE 中 IntelliSense 就找的到囉~