這是改寫MSDN的Treeview的PopulateOnDemand範例,該範例主要是在示範SQL資料庫和Treeview的搭配使用。
而本範例以AccessDB為例子,目標在於除了示範TreeView的階層使用以外,另含搜尋功能。雖然本範例最終的code並不如想像的多,而多了解一下的話也會覺得並非想像中的難,但是在起步研究的時候到是花了我挺多心思。在這過程中深入的了解dataset、TreeView、oledb等組件的運用。如果您本身就很熟稔這些組件的話相信本範例不用一天即可了解其運作。希望本範例能夠給正苦於此的人一點指引。
這範例其實有些缺點,像是有些累贅的語法、變數名稱取不好之類的,那是為了我自己方便所致,請見諒。如果可以改更短的話也歡迎提出。
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data.OleDb" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
Function RunQuery(ByVal sqlQuery As OleDbCommand) As DataSet
Dim x As String
x = ConfigurationManager.ConnectionStrings("ConnectionString2").ConnectionString
Dim xx As New OleDbConnection
xx.ConnectionString = x
Dim xxx As New OleDbDataAdapter
xxx.SelectCommand = sqlQuery
sqlQuery.Connection = xx
Dim xxxx As DataSet = New DataSet
Try
xxx.Fill(xxxx)
Catch ex As Exception
Response.Write("Unable to connect to SQL Server.")
End Try
Return xxxx
End Function
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim sqlQuery As New OleDbCommand
If TextBox1.Text <> "" Then
TrvwClear()
sqlQuery.CommandText = "SELECT udb_com.com, udb_member.name FROM (udb_com INNER JOIN udb_member ON udb_com.com = udb_member.com) WHERE (udb_com.com LIKE '%' + '" & TextBox1.Text & "' + '%') OR (udb_member.name LIKE '%' + '" & TextBox1.Text & "' + '%') ORDER BY udb_com.com, udb_member.name"
Else
sqlQuery.CommandText = "SELECT [No], [com] FROM [udb_com]"
End If
Dim ResultSet As DataSet = RunQuery(sqlQuery)
Response.Write("資料列數量:" & ResultSet.Tables(0).Rows.Count - 1 & "<BR>")
If ResultSet.Tables.Count > 0 Then
Dim notsame As Integer = 0
Dim same As Integer = 0
Dim TreeNodeCount As Integer = TreeView1.Nodes.Count
For rank As Integer = 0 To ResultSet.Tables(0).Rows.Count - 1
Select Case rank
Case 0
Dim NewNode As TreeNode = New TreeNode(ResultSet.Tables(0).Rows.Item(0).Item(0))
NewNode.PopulateOnDemand = False
NewNode.SelectAction = TreeNodeSelectAction.Select
TreeView1.Nodes.Add(NewNode)
Dim MemberNode As TreeNode = New TreeNode(ResultSet.Tables(0).Rows.Item(0).Item(1))
MemberNode.PopulateOnDemand = False
MemberNode.SelectAction = TreeNodeSelectAction.Select
TreeView1.Nodes(TreeView1.Nodes.IndexOf(NewNode)).ChildNodes.Add(MemberNode)
Case Else
If TreeView1.Nodes(TreeView1.Nodes.Count - 1).Value <> ResultSet.Tables(0).Rows.Item(rank).Item(0) Then
Dim NewNode As TreeNode = New TreeNode(ResultSet.Tables(0).Rows.Item(rank).Item(0))
NewNode.PopulateOnDemand = False
NewNode.SelectAction = TreeNodeSelectAction.Select
TreeView1.Nodes.Add(NewNode)
Dim MemberNode As TreeNode = New TreeNode(ResultSet.Tables(0).Rows.Item(rank).Item(1))
MemberNode.PopulateOnDemand = False
MemberNode.SelectAction = TreeNodeSelectAction.Select
TreeView1.Nodes(TreeView1.Nodes.IndexOf(NewNode)).ChildNodes.Add(MemberNode)
Else
Dim NewNode As TreeNode = New TreeNode(ResultSet.Tables(0).Rows.Item(rank).Item(1))
NewNode.PopulateOnDemand = False
NewNode.SelectAction = TreeNodeSelectAction.Select
TreeView1.Nodes(TreeView1.Nodes.Count - 1).ChildNodes.Add(NewNode)
'Response.Write(TreeView1.Nodes.IndexOf(NewNode))
'Response.Write(TreeView1.Nodes(TreeView1.Nodes.Count - 1).Value & " = " & ResultSet.Tables(0).Rows.Item(rank).Item(0) & "<BR>")
End If
End Select
Next
End If
End Sub
Sub addmember()
End Sub
Private Sub TrvwClear()
Dim x As Integer
With TreeView1.Nodes
For x = .Count - 1 To 0 Step -1
.RemoveAt(x)
Next x
End With
End Sub
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim Focus As Integer = TreeView1.Nodes.Count
Response.Write(Focus)
End Sub
Protected Sub TreeView1_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs)
TreeView1.SelectedNode.Expand()
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="TextBox1" runat="server" Text="豐" />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<asp:Button ID="Button2" runat="server" Text="Button" />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:TreeView ID="TreeView1" runat="server" imageSet="Contacts"
NodeIndent="10" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
<ParentNodeStyle Font-Bold="True" ForeColor="#5555DD" />
<HoverNodeStyle Font-Bold="False" Font-Underline="False" ForeColor="Red" />
<SelectedNodeStyle BackColor="#CCFFCC" Font-Bold="True" Font-Underline="True"
HorizontalPadding="0px" VerticalPadding="0px" />
<NodeStyle Font-Names="新細明體" Font-Size="Small" ForeColor="Black"
HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" />
</asp:TreeView>
<asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False"
DataKeyNames="No" DataSourceID="SqlDataSource2" Height="50px" Width="125px">
<Fields>
<asp:BoundField DataField="No" HeaderText="No" InsertVisible="False"
ReadOnly="True" SortExpression="No" />
<asp:BoundField DataField="class" HeaderText="class" SortExpression="class" />
<asp:BoundField DataField="com" HeaderText="com" SortExpression="com" />
<asp:BoundField DataField="boss" HeaderText="boss" SortExpression="boss" />
<asp:BoundField DataField="comno" HeaderText="comno" SortExpression="comno" />
<asp:BoundField DataField="address" HeaderText="address"
SortExpression="address" />
<asp:BoundField DataField="tel" HeaderText="tel" SortExpression="tel" />
<asp:BoundField DataField="fax" HeaderText="fax" SortExpression="fax" />
<asp:BoundField DataField="connect" HeaderText="connect"
SortExpression="connect" />
<asp:BoundField DataField="now" HeaderText="now" SortExpression="now" />
</Fields>
</asp:DetailsView>
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString2 %>"
ProviderName="<%$ ConnectionStrings:ConnectionString2.ProviderName %>"
SelectCommand="SELECT [No], [com] FROM [udb_com] WHERE ([com] LIKE '%' + ? + '%')"
DeleteCommand="DELETE FROM [udb_com] WHERE [No] = ?"
InsertCommand="INSERT INTO [udb_com] ([No], [com]) VALUES (?, ?)"
UpdateCommand="UPDATE [udb_com] SET [com] = ? WHERE [No] = ?">
<SelectParameters>
<asp:ControlParameter ControlID="TextBox1" Name="com" PropertyName="Text"
Type="String" />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name="No" Type="Int32" />
</DeleteParameters>
<UpdateParameters>
<asp:Parameter Name="com" Type="String" />
<asp:Parameter Name="No" Type="Int32" />
</UpdateParameters>
<InsertParameters>
<asp:Parameter Name="No" Type="Int32" />
<asp:Parameter Name="com" Type="String" />
</InsertParameters>
</asp:SqlDataSource>
<asp:SqlDataSource ID="SqlDataSource2" runat="server"
ConnectionString="<%$ ConnectionStrings:ConnectionString2 %>"
ProviderName="<%$ ConnectionStrings:ConnectionString2.ProviderName %>"
SelectCommand="SELECT * FROM [udb_com] WHERE ([com] = ?)">
<SelectParameters>
<asp:ControlParameter ControlID="TreeView1" Name="com" PropertyName="SelectedValue"
Type="String" />
</SelectParameters>
</asp:SqlDataSource>
</form>
</body>
</html>