Ramin Hashimzade

Фильтр по тегу: создание динамического меню


Создание пользовательского меню - ASP .NET

Как обещал ранее, выкладываю решение по "Создание пользовательского меню" на платформе 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>
                    &nbsp;
                    <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_IDBP_PARENT_IDBP_LEVEL_IDBP_MENU_CAPTIONBP_REPORT_ID
10Главное
20Отчеты
611Склад ./wfrm_form1.aspx
711Приход
811Расход
922Бухгалтерия
1022Казначейство
1193Отчет об остатках ./myfrm_form2.aspx
1293Отчет о прибыли
13103Денежные обороты
14103Касса
15103Тестовый отчет



Далее обработка кнопки 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();
            }
        }

    }
}


скриншоты теста:
Картинка с другого сайта.
Картинка с другого сайта.

---
Ramin Hashimzade