在之前的文章-->ASP.NET 2.0動態產生TreeView樹狀結構-C# & VB.NET 混合 提到過動態產生Menu
如果和物件導向結合 會是什麼樣的情景呢!?(當然 顯示出來的結果要是一樣,只是內部設計不同)
有關於物件導向設計方式 請參考 -->燃燒吧~~ObjectDataSouce配合物件導向的設計方式連結資料 VB.NET
廢話不多說~實際操作看看吧!
在之前的文章-->ASP.NET 2.0動態產生TreeView樹狀結構-C# & VB.NET 混合 提到過動態產生Menu
如果和物件導向結合 會是什麼樣的情景呢!?(當然 顯示出來的結果要是一樣,只是內部設計不同)
有關於物件導向設計方式 請參考 -->燃燒吧~~ObjectDataSouce配合物件導向的設計方式連結資料 VB.NET
廢話不多說~實際操作看看吧!
首先 設計一個 objMenu的模型出來
01 ''' <summary> 02 ''' Menu 資料庫物件,資料存取層物件。 By Phoehix - 2008 03 ''' </summary> 04 ''' <remarks></remarks> 05
Public Class objMenu
06
Inherits objADU
07
Private _ID
As Integer 08
Private _ParentID
As Integer 09
Private _Value
As String 10
Private _Order
As Integer 11 
Public Property MenuID() Property MenuID() As Integer
12
Get
13
Return _ID
14
End Get
15
Set(ByVal value As Integer)
16
_ID = value
17
End Set
18
End Property
19
20 
Public Property MenuParentID() Property MenuParentID() As Integer
21
Get
22
Return _ParentID
23
End Get
24
Set(ByVal value As Integer)
25
_ParentID = value
26
End Set
27
End Property
28
29 
Public Property MenuValue() Property MenuValue() As String
30
Get
31
Return _Value
32
End Get
33
Set(ByVal value As String)
34
_Value = value
35
End Set
36
End Property
37 
Public Property MenuOrder() Property MenuOrder() As Integer
38
Get
39
Return _Order
40
End Get
41
Set(ByVal value As Integer)
42
_Order = value
43
End Set
44
End Property
45 
Public Sub New() Sub New()
46
47
End Sub
48 
Public Sub New() Sub New(ByRef row As DataRow)
49
GetMenu(row)
50
End Sub
51 
Private Sub GetMenu() Sub GetMenu(ByRef row As DataRow)
52
Try
53
_ID = Integer.Parse(row(0).ToString())
54
_ParentID = Integer.Parse(row(1).ToString())
55
_Value = row(2).ToString()
56
_Order = Integer.Parse(row(3).ToString())
57
Catch ex As Exception
58
Throw
59
End Try
60
End Sub
61 
Public Overloads Sub Add() Overloads Sub Add()
62
Try
63
Dim SqlTxt As String = "INSERT INTO [Menu] ([ParentID], [Value], [Order]) VALUES (@ParentID, @Value, @Order)"
64
Dim Parameters(3) As SqlParameter
65
Parameters(0) = New SqlParameter("@ParentID", _ParentID)
66
Parameters(1) = New SqlParameter("@Value", _Value)
67
Parameters(3) = New SqlParameter("@Order", _Order)
68
add(SqlTxt, Parameters)
69
Catch ex As Exception
70
Throw
71
End Try
72
End Sub
73 
Public Overloads Sub Del() Overloads Sub Del()
74
Try
75
Dim SqlTxt As String = "Delete [Menu] WHERE ([ID] = @Original_ID)"
76
Dim Parameter As SqlParameter = New SqlParameter("@Original_ID", _ID)
77
Del(SqlTxt, Parameter)
78
Catch ex As Exception
79
Throw
80
End Try
81
End Sub
82 
Public Overloads Sub Update() Overloads Sub Update()
83
Try
84
Dim SqlTxt As String = "UPDATE Menu Set ParentID = @ParentID, Value = @Value, Order = @Order WHERE ID = @Original_ID"
85
Dim Parameters(4) As SqlParameter
86
Parameters(0) = New SqlParameter("@ParentID", _ParentID)
87
Parameters(1) = New SqlParameter("@Value", _Value)
88
Parameters(3) = New SqlParameter("@Order", _Order)
89
Parameters(4) = New SqlParameter("@Original_ID", _ID)
90
Update(SqlTxt, Parameters)
91
Catch ex As Exception
92
Throw
93
End Try
94
End Sub
95 
Protected Overrides Sub Finalize() Overrides Sub Finalize()
96
MyBase.Finalize()
97
End Sub
98
End Class
再來設計一個配合存取資料的BLL.daoMenu,進行新增、修改、刪除、查詢的動作
再來 關於GetMenu,AddRoot,AddNodes 修改如下
9-宣告 daoMenu 成為新的執行個體
10- 宣告 objMenu 為一個物件的List集合
11-從daoMenu.GetMenu() 這個方法填入objMenu
13-把參數 用Ref的方式傳過去
14~ 類似的不再贅述
再來 ~AddRoot
修改的部份為
6- 有趣 有趣 ... 先宣告一個lists 來承接 objMenu.FindAll 出來的結果 (厄!? 其實我忘記這是哪邊看來的 ...
這裡重點就是在delegate(DAL.objMenu list) { return list.MenuParentID == 0; } 意思是 傳回 MenuParentID = 0(跟節點)
9-判斷 是否有資料
11-把資料 一一的取出
13-15 把資料填入
19-傳objMenu過去 一樣用ref方式 (應該是可以節省 複製一份出來的記憶體 ...)
22-告訴.NET 我不要lists 了= =、
最後AddNodes
修改的部份如下
6- 跟上面差不多 只是 ParentID 要改用傳過來的節點代號 篩選出該節點的子節點
11-foreach一一取出資料
13~15 填入資料
然後就完成囉!
當然 ... 顯示出來的結果會是一樣的
以上 ~ 我覺得 比較值得一提的是 LIST<T>.FindAll 這個方法 ... 蠻有趣的呢~ 大家可以參考MSDN ->List<(Of <(T>)>)..::.FindAll 方法
Phoenix 8/5