2008年8月23日 星期六

VB 的Windows 應用程式程式架構

想要使用VB提供的應用程式架構, 但又想自己控制初始執行表單的順序...

這是上課時同學問的問題.

他的問題細節是這樣的, 要先有一個登入視窗, 通過登入流程之後, 顯示SplashScreen 之後才是MainForm.

過去我們會將這程序寫在Sub Main, 然後專案的"啟動表單"指定成為Sub Main.

但是在Visual Studio的Visual Basic專案, 若要指定Sub Main必須將"啟用應用程式架構"停用, 這代表無法享用Visual Baisc提供的應用程式架構, 這個同學的需求中又需要用到這個架構, 該如何解決這問題呢?

測試了一下, 我的解決方案如下:

Step1.使用 "檢視應用程式事件"

1

Step2.在ApplicationEvents.vb 覆寫 OnInitialize 方法

Protected Overrides Function OnInitialize(ByVal commandLineArgs As System.Collections.ObjectModel.ReadOnlyCollection(Of String)) As Boolean 

    LoginForm1.ShowDialog()

    If User.IsAuthenticated Then 
        Return MyBase.OnInitialize(commandLineArgs)

    End If

End Function


使用User.IsAuthenticated 檢查是否通過驗證, 如果通過驗證才繼續初始化(呼叫 MyBase.OnInitialize(commandLineArgs) ), 如果未呼叫MyBase.OnInitialize的話, Application不會繼續初始化, 應用程式就會自動結束.



完成!!



A1: 為什麼要覆寫OnInitialize 而不寫在Statup 事件?

Q1: 因為Statup事件已經啟動SplashScreen, 不符合要先Login 再進SplshScreen 的需求. 而且無法控制登入失敗要終止程式(無法呼叫Application.Exit方法)



A2: 怎麼寫LoginForm1的程式?

Q2: 以下步驟解說:


     step1: 加入新項目, 選取"登入表單"

     step2: 允許兩次登入失敗, 宣告變數記錄


Dim errorTry As Short = 0


    step3: 修改OK 按鈕的Click事件如下: (要Imports System.Security.Principal)


Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click  
    Dim roles() As String
    If Not CheckUser(UsernameTextBox.Text, PasswordTextBox.Text, roles) Then
        errorTry += 1
        If errorTry >= 3 Then
            Me.Close()
        End If
        Return
    End If
    Dim iden As New GenericIdentity(UsernameTextBox.Text)
    My.User.CurrentPrincipal = New GenericPrincipal(iden, roles)
    Me.Close()
End Sub

  在登入成功之後, 設定My.User.CurrentPrincipal, 就可以讓User.IsAuthenticated 回傳True.   



    step4: CheckUser 方法是寫檢查帳號密碼的程式, 請自行設計, 下列程式僅供參考.


Private Function CheckUser(ByVal Username As String, ByVal Password As String, ByRef Roles() As String) As Boolean  
    If String.IsNullOrEmpty(Username) Then
        Return False
    End If
    Roles = New String() {"Users"}
    Return True
End Function

2008年8月15日 星期五

ASP.NET 3.5 sp1 新增的 Dynamic Data網站

Visual Studio 2008 sp1 在建立ASP.NET 網站的範本中多了"Dynamic Data網站"Dynamic Data 網站範本

又是一個令人 "哇!" 的功能, 簡單來說, 建立網站之後, 他只需要做三個步驟就可以完成網頁資料表的"新刪修"功能.

1. 加入新項目 "Link to SQL 類別"

選擇Link to SQL

2.伺服器總管連到Northwind資料庫, 並將必要的資料表拖拉到Link to SQL 類別的設計視窗.

設計Link to SQL

3.接著修改Global.asax的程式碼, 移去下面這行程式的註解, 並修改"YourDataContextType"為第一步驟加入的Link to SQL的類別名稱, 以及設定ScaffoldAllTables 屬性為True即可.

model.RegisterContext(GetType(DataClassesDataContext), _
                      New ContextConfiguration() With {.ScaffoldAllTables = True})

執行結果:

執行結果1 - 資料表名稱

點選"Employees"之後

執行結果2 - Employees List

點"詳細資料"

執行結果3 - Employees Detail

 

相關參考: Your First Scaffold, and What Is Dynamic Data-

2008年8月12日 星期二

Visual Studio 2008 SP1 開放下載了

Visual Studio 2008 SP1 已經於8/11開放下載了.

http://www.microsoft.com/downloads/details.aspx?displaylang=zh-tw&FamilyID=fbee1648-7106-44a7-9649-6d9f6d58056e

注意事項:

  1. 最好先完成作業系統的Windows Update再安裝VS2008 SP1.
  2. 如果是Vista 請先關閉"Windows 資訊看板"
  3. 若之前曾安裝一些Beta 版的相關軟體, 請先移除.
  4. 如果還是裝不起來, 請先閱讀上面Link頁中的ReadMe