Hi All,
I am using VWD 2010 Express with mySQL as database. I have a treeview
menu which i want to populate as per the permissons/access set. I took
ideas/codes from these links
http://aspalliance.com/732
http://www.codeproject.com/Articles/366450/Permissions-and-Levels-in-ASP-Menu
My treeview is as below:
<div id="MainMenu" style="height: 600px;">
<asp:TreeView ID="tvwMainMenu" runat="server" ExpandDepth="0" PopulateNodesFromClient="true"
ShowLines="true" ShowExpandCollapse="true" SelectedNodeStyle-BackColor="#8E909C"
SelectedNodeStyle-BorderColor="Black" HoverNodeStyle-BackColor="#7E909C" HoverNodeStyle-BorderColor="Black"
ImageSet="BulletedList4">
</asp:TreeView>
</div>
My menu structure and user permission table and data is as below
Menu Structure
ID nID nName Path
3 0 Orders
1 0 Masters
2 0 Quotes
4 1 System Master system.aspx
5 1 Clients Master clients.aspx
6 1 Agents Master agents.aspx
7 2 New Orders neworders.aspx
8 2 Pending Orders pendingorders.aspx
9 3 Estimates estimates.aspx
10 3 Estimate Lists estimatelists.aspx
User Permissions
uID Password uLevel
aa ad 1-2-3-4-5-6-7-8-9-10
uu us 1-2-4-5-6-9-10
What i want is that the treeview should be populated according to the structure set in the Users Permissions table
My codebehind is as below:
Dim permissions() As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
GetConnDetails()
If Not Page.IsPostBack Then
If Not Session("UName") = "" Then
LoadMenu()
End If
LoadRootMenu()
End If
Private Sub GetConnDetails()
Dim conn As New MySql.Data.MySqlClient.MySqlConnection
Dim myConnectionString As String
myConnectionString = "server=127.0.0.1; uid=ua;pwd=pa;database=db;"
Try
conn.ConnectionString = myConnectionString
conn.Open()
Catch ex As MySql.Data.MySqlClient.MySqlException
MsgBox(ex.Message)
End Try
End Sub
Private Sub LoadMenu()
If Session("UName") = "" Then
Return
End If
Dim strPermissionString As String
strPermissionString = getUserPermissions(Session("UName").ToString())
permissions = strPermissionString.Split("-")
End Sub
Private Function getUserPermissions(ByVal strUserName As String) As String
Dim myDataSet As New DataSet
Dim dt As New DataTable
Dim objConn As New MySqlConnection("server=127.0.0.1; user id=ua; password=pa; database=db; pooling=false;")
Dim objCommand As New MySqlCommand("SELECT * FROM users where NameOfUser='" & Session("UName") & "'", objConn)
Dim da As New MySqlDataAdapter(objCommand)
da.Fill(myDataSet, "UserDetails")
If myDataSet.Tables("UserDetails").Rows.Count = 0 Then
ScriptManager.RegisterStartupScript(Me, Me.GetType(), "not found!", "alert('User not Found!!')", True)
Return ""
End If
objConn.Close()
Return myDataSet.Tables("UserDetails").Rows(0)("uLevel").ToString()
End Function
Public Sub PopulateRootLevel()
Dim tvwMain As New TreeView
tvwMain = Me.FindControl("tvwMain")
Dim myDataSet As New DataSet
Dim dt As New DataTable
Dim objConn As New MySqlConnection("server=localhost; user id=ua; password=pa; database=db; pooling=false;")
Dim strTemp As String
strTemp = "SELECT nID, nName, (SELECT COUNT(*) FROM Menu sc WHERE sc.nID = nID) childnodecount FROM Menu "
For Each childID In permissions
If IsNumeric(childID) = False Then
Exit For
End If
If IndexOf(permissions, childID) = 0 Then
strTemp += " WHERE ID = " + childID
Else
strTemp += " OR ID = " + childID
End If
Next
strTemp += " ORDER BY NodeID"
MsgBox(strTemp)
Dim objCommand As New MySqlCommand(strTemp, objConn)
Dim da As New MySqlDataAdapter(objCommand)
da.Fill(dt)
PopulateNodes(dt, tvwMain.Nodes)
End Sub
Private Sub PopulateNodes(ByVal dt As DataTable, ByVal nodes As TreeNodeCollection)
For Each dr As DataRow In dt.Rows
Dim tn As New TreeNode()
tn.Text = dr("nName").ToString()
tn.Value = dr("nID").ToString()
nodes.Add(tn)
tn.PopulateOnDemand = (CInt(dr("childnodecount")) > 0)
Next
End Sub
Private Sub PopulateSubLevel(ByVal parentid As Integer, ByVal parentNode As TreeNode)
' Dim objConn As New MySqlConnection("server=localhost; user id=ua; password=pa; database=db; pooling=false;")
' Dim objCommand As New MySqlCommand("select id,nName,(select count(*) FROM Menu " _
' & "WHERE nID=sc.id) childnodecount FROM MainMenu sc where nID=@parentID", objConn)
' objCommand.Parameters.AddWithValue("@parentID", SqlDbType.Int).Value = parentid
' Dim da As New MySqlDataAdapter(objCommand)
' Dim dt As New DataTable()
' da.Fill(dt)
' PopulateNodes(dt, parentNode.ChildNodes)
End Sub
Protected Sub tvwMainMenu_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles tvwMainMenu.TreeNodePopulate
'PopulateSubLevel(CInt(e.Node.Value), e.Node)
End Sub
I have commented some bits in order to first populate the root nodes
(Orders, Masters, Quotes etc.) and then put permissible sub nodes under
each root node.
The code above is not working correctly and all nodes are being
populated as root nodes. Where am i going wrong? I will try to add the
navigation link later but if it can be included in the correct solution,
I will appreciate.
Thanks in advance
Tom