Как обещал ранее, выкладываю решение по "Создание пользовательского меню" на платформе Visual Studio 2010, языке C#. Структура Базы остается
прежним, меняется только таблица BP_USER_MENU поле BP_REPORT_ID, который в свою очередь уже хранит в себе ссылку на страниц.
И так, открываем студию, создаем новый проект и например даем имя проекта Project_UserMenu. Далее добавляем новую страницу, страницу "Входа" и назовем его wfrm_login (учтите что добавление префикса в начале имена объектов, освобождает вас от не чайно использованием зарезервированных слов, в данном случаи префикс "wfrm" означает "web form"), так как эта статья носит тестовый характер, интерфейс входа в приложение будет совсем простым. Добавляем 2 TextBox , 1 Button , 1 Treeview и 1 Custom Validator для отображении ошибок.

<body>
<form id="form1" runat="server">
<div>
<table class="style1">
<tr>
<td>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:TextBox ID="TextBox2" runat="server" TextMode="Password"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Login" onclick="Button1_Click" />
</td>
</tr>
<tr>
<td>
<asp:CustomValidator ID="CustomValidator1" runat="server"
ErrorMessage="CustomValidator"></asp:CustomValidator>
</td>
</tr>
<tr>
<td>
<asp:TreeView ID="cmp_Menu_TreeView" runat="server" ShowLines="true" Style="margin-right: 0px"
Font-Bold="True" Font-Size="Medium" ForeColor="Black">
</asp:TreeView>
</td>
</tr>
</table>
</div>
</form>
</body>
Далее добавляем наши бизнес страницы который будет открываться когда будет выбрано соответствующий нод в меню. Для примера я добавляю 2 страницы с именами wfrm_form1, myfrm_form2 в проект и в таблице BP_USER_MENU в поле BP_REPORT_ID указываем меню который должен открывать эти страницы:
| BP_ID | BP_PARENT_ID | BP_LEVEL_ID | BP_MENU_CAPTION | BP_REPORT_ID | | 1 | | 0 | Главное | | | 2 | | 0 | Отчеты | | | 6 | 1 | 1 | Склад | ./wfrm_form1.aspx | | 7 | 1 | 1 | Приход | | | 8 | 1 | 1 | Расход | | | 9 | 2 | 2 | Бухгалтерия | | | 10 | 2 | 2 | Казначейство | | | 11 | 9 | 3 | Отчет об остатках | ./myfrm_form2.aspx | | 12 | 9 | 3 | Отчет о прибыли | | | 13 | 10 | 3 | Денежные обороты | | | 14 | 10 | 3 | Касса | | | 15 | 10 | 3 | Тестовый отчет | |
|
Далее обработка кнопки Button , который в свою очередь будет создавать коннект к Базе данных и вызов метода Populate() на рисование соответствующего меню пользователя. Запрос остается тот же:
SELECT USER_MENU.BP_ID,
USER_MENU.BP_PARENT_ID,
USER_MENU.BP_LEVEL_ID,
USER_MENU.BP_MENU_CAPTION,
USER_MENU.BP_REPORT_ID
FROM RAMIN.BP_USER t1
JOIN RAMIN.BP_USER_GROUP_MENU T
ON T1.BP_USER_GROUP_ID = T.BP_USER_GROUP_ID
JOIN RAMIN.BP_USER_MENU USER_MENU
ON USER_MENU.BP_ID = T.BP_MENU_ID
WHERE (T1.BP_LOGIN = 'ЛОГИН ПОЛЬЗОВАТЕЛЯ ВХОДЯЩЕГО В СИСТЕМУ')
ORDER BY USER_MENU.BP_LEVEL_ID, USER_MENU.BP_ID
Behind Code странице wfrm_login:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Oracle.DataAccess.Client;
namespace Project_UserMenu
{
public partial class wfrm_login : System.Web.UI.Page
{
string myconn;
OracleConnection appConn;
protected void Page_Load(object sender, EventArgs e)
{
cmp_Menu_TreeView.Nodes.Clear();
}
protected void Button1_Click(object sender, EventArgs e)
{
myconn = "Data Source=MYDB;User ID=" + TextBox1.Text + ";Password=" + TextBox2.Text;
try
{
appConn = new OracleConnection(myconn);
appConn.Open();
Populate();
}
catch (Exception ex)
{
CustomValidator1.IsValid = false;
CustomValidator1.Text = ex.Message;
return;
}
}
// Рисование меню пользователя в виде дерево.
private void Populate()
{
OracleDataAdapter oraAdap = new OracleDataAdapter();
oraAdap.SelectCommand = new OracleCommand();
oraAdap.SelectCommand.Connection = appConn;
oraAdap.SelectCommand.CommandText = Resource1.myQuery;
oraAdap.SelectCommand.Parameters.Add("login", OracleDbType.Varchar2, 10).Value = TextBox1.Text;
OracleDataReader oraRead = oraAdap.SelectCommand.ExecuteReader();
while (oraRead.Read())
{
if (System.Convert.ToString(oraRead["BP_PARENT_ID"]) == "")
{
TreeNode tn = new TreeNode();
tn.Text = (string)oraRead["BP_MENU_CAPTION"];
tn.Value = System.Convert.ToString(oraRead["BP_ID"]);
tn.SelectAction = TreeNodeSelectAction.Expand;
cmp_Menu_TreeView.Nodes.Add(tn);
tn.NavigateUrl = System.Convert.ToString(oraRead["BP_REPORT_ID"]);
}
else
{
TreeNode tn = new TreeNode();
tn.Text = (string)oraRead["BP_MENU_CAPTION"];
tn.Value = System.Convert.ToString(oraRead["BP_ID"]);
tn.Target = "_blank";
tn.NavigateUrl = System.Convert.ToString(oraRead["BP_REPORT_ID"]);
AddChildNode(cmp_Menu_TreeView.Nodes, System.Convert.ToString(oraRead["BP_PARENT_ID"]), tn);
}
}
oraRead.Close();
}
// Добавление дочерный нодов ("Как добавить дочерные ноды зная его родителскый нод")
private void AddChildNode(TreeNodeCollection n, string val, TreeNode tn)
{
for (int i = 0; i < n.Count; i++)
{
if (n[i].Value == val)
{
n[i].ChildNodes.Add(tn);
n[i].SelectAction = TreeNodeSelectAction.Expand;
n[i].NavigateUrl = "";
}
n[i].Expand();
AddChildNode(n[i].ChildNodes, val, tn);
n[i].Collapse();
}
}
}
}
скриншоты теста:


И собственно сам проект: