Меню в UpdatePanel не исчезает после первого клика на item
От: TheAteist  
Дата: 29.11.08 23:34
Оценка:
Следующий код строит динамически TreeView используя мои библиотеки TreeDiagramNode, ConfigurationTree. Библиотека ConfigurationTree получает Table1 и в него строит дерево.
Каждый нод содержит меню, а меню в свою очередь находится в UpdatePanel. Если провести мышкой над Actions, то появляется <b>меню</b> . Когда мышка убирается то меню исчезает.
После нажатия на AddChild появляется ModalPopup и после его исчезновения меню не ичезает после проведения мышки над Actions. Получается <b>вот это</b>.
Будто меню замерзает. Нажимать можно, оно только не исчезает поселе после первого нажатия на Action.
Помогите пожалуйста. Очень надо.

Спасибо

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CNV.aspx.cs" Inherits="CNV" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <link href="css/ModalDialogs.css" rel="stylesheet" type="text/css" />
    <script type="text/javascript">
            function modalPermissions()
            {                
                //Show the modal popup to add new element
                document.getElementById("btnHiddenShowNewElement").click();
            }            
            function load()
            {
                //Tell the request manager to run a javascript function on returning from a Asynchronous post back event of AJAX.
                Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
            }
            function EndRequestHandler()
            {               
                if(document.getElementById('<%= hfShowNewElement.ClientID %>').value =="true")
                    modalPermissions();
            }             
    </script>
</head>
<body  onload="load()">
    <form id="form1" runat="server">
        <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" ScriptPath="scripts\MicrosoftAjaxLibrary">
        </ajaxToolkit:ToolkitScriptManager>    
        <div>       
            <asp:Button ID="btnNewConfigTree" runat="server" Text="הוסף עץ תצורה" />
            <asp:Table ID="Table1" runat="server"  CellPadding="0" CellSpacing="0" style="vertical-align: top">
            </asp:Table>
            <asp:Panel ID="pnlNewElement" runat="server" CssClass="modalPopup" Width="300px" Height="230px" style="display:none; overflow:auto;">
                <table>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
                        <td>
                            <asp:Label ID="lblElementName" runat="server" Text="name"></asp:Label></td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <asp:DropDownList ID="ddlElementKind" runat="server" DataSourceID="SQLdsElementKind"
                                DataTextField="sName" DataValueField="Id">
                            </asp:DropDownList>
                        </td>
                        <td>
                            <asp:Label ID="txtElementKind" runat="server" Text="kind"></asp:Label></td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <asp:TextBox ID="txtDescription" runat="server"></asp:TextBox></td>
                        <td>
                            <asp:Label ID="lblDescription" runat="server" Text="description"></asp:Label></td>
                    </tr>
                </table>
                <asp:Button ID="btnCancel" runat="server" Text="cancel" />
                <asp:SqlDataSource ID="SQLdsElementKind" runat="server" ConnectionString="<%$ ConnectionStrings:esek %>"
                    SelectCommand="SELECT [Id], [sName] FROM [vElementKind]"></asp:SqlDataSource>
                    <asp:Button ID="btnRefresh" runat="server" style="visibility:hidden;" OnClick="btnRefresh_Click"/>
            </asp:Panel>
            <asp:Button ID="btnHiddenShowNewElement" runat="server" Text="Button" />
            
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
                    <asp:HiddenField ID="hfShowNewElement" runat="server" />
                </ContentTemplate>
            </asp:UpdatePanel>
            
            <ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="btnHiddenShowNewElement" PopupControlID="pnlNewElement" BackgroundCssClass="modalBackground" DropShadow="true" CancelControlID="btnCancel" >
            </ajaxToolkit:ModalPopupExtender>
        </div>
    </form>
</body>
</html>


protected void Page_Load(object sender, EventArgs e)
    {
        BuildTree();
        //Don't call javafunction 'modalPermissions' after Asynchronous post back event of AJAX
        hfShowNewElement.Value = "false";   
    }
    
    void BuildTree()
    {                
        DataTable dtTree;
        DataView dvTree;
        ArrayList alNode;
        ConfigurationTree _ConfigurationTree;

        Table1.Controls.Clear();
        _ConfigurationTree = new ConfigurationTree(Table1);

        if ((dtTree = _ConfigurationTree.GetTree(Request["ProjId"])) == null)
        {
            showError(_ConfigurationTree.ErrorDescription);
            return;
        }

        if (dtTree.Rows.Count > 0)
        {
            dvTree = new DataView(dtTree);

            //Get records with TreeLevel = i
            dvTree.RowFilter = "nTLevel=1";

            alNode = buildNodeContent((string)dvTree[0].Row["ElementName"], (string)dvTree[0].Row["ElementVersionName"]);

            _ConfigurationTree.BaseNode.AddControl((UpdatePanel)alNode[0]);            
            _ConfigurationTree.BaseNode.AddToStyle("background-color", "blue");
            _ConfigurationTree.BaseNode.AddToStyle("text-align", "center");
            buildNode(dtTree, _ConfigurationTree.BaseNode, dvTree[0].Row["ElementId"].ToString());
        }
    }
    /// <summary>
    /// Build node recursively
    /// </summary>
    /// <param name="dtTree"></param>
    /// <param name="Node"></param>
    /// <param name="strFatherElementId"></param>
    void buildNode(DataTable dtTree, TreeDiagramNode Node, string strFatherElementId)
    {
        ArrayList alNode;
        TreeDiagramNode subNode;
        DataView dvTree = new DataView(dtTree);

        //Filter all element that belong to FatherElementId
        dvTree.RowFilter = "uFatherElement='" + strFatherElementId + "'";
        
        for (int i = 0; i < dvTree.Count; i++)
        {
            
            alNode = buildNodeContent((string)dvTree[i].Row["ElementName"], (string)dvTree[i].Row["ElementVersionName"]);

            subNode = Node.CreateChildNode();

            subNode.AddControl((UpdatePanel)alNode[0]);           
            subNode.AddToStyle("background-color", "blue");
            subNode.AddToStyle("text-align", "center");
            
            buildNode(dtTree, subNode, dvTree[i].Row["ElementId"].ToString());
        }
        
    }
    ArrayList buildNodeContent(string ElementName, string strVersion)
    {
        Label _Label = new Label();
        Menu _Menu;
        MenuItem _MenuItem;
        ArrayList alNode;

        _Label.Font.Bold = true;
        _Label.Font.Name = "Malgun Gothic";
        _Label.ForeColor = System.Drawing.Color.Black;
        _Label.Text = ElementName + " " + strVersion;

        _Menu = new Menu();

        _Menu.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicHorizontalOffset = 2;
        _Menu.Font.Name = "Verdana";
        _Menu.Font.Size = 10;
        _Menu.ForeColor = System.Drawing.Color.Teal;
        _Menu.StaticSubMenuIndent = new Unit(10, UnitType.Pixel);
        _Menu.Style.Add("direction", "rtl");
        _Menu.Style.Add("text-align", "right");
        _Menu.StaticSelectedStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.StaticMenuItemStyle.HorizontalPadding = new Unit(5, UnitType.Pixel);
        _Menu.StaticMenuItemStyle.VerticalPadding = new Unit(2, UnitType.Pixel);
        _Menu.DynamicHoverStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicHoverStyle.ForeColor = System.Drawing.Color.White;
        _Menu.DynamicMenuStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicSelectedStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicMenuItemStyle.HorizontalPadding = new Unit(5, UnitType.Pixel);
        _Menu.StaticHoverStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.StaticHoverStyle.ForeColor = System.Drawing.Color.White;

        _MenuItem = new MenuItem("actions", "actions");
        
        _Menu.Items.Add(_MenuItem);
        _MenuItem.ChildItems.Add(new MenuItem("History", "history"));
        _MenuItem.ChildItems.Add(new MenuItem("UpdateVersion", "version"));
        _MenuItem.ChildItems.Add(new MenuItem("AddChild", "child"));

        _Menu.MenuItemClick += new MenuEventHandler(Menu_MenuItemClick);
        alNode = new ArrayList();
        
        UpdatePanel _UpdatePanel = new UpdatePanel();
        
        _UpdatePanel.ContentTemplateContainer.Controls.Add(_Label);
        _UpdatePanel.ContentTemplateContainer.Controls.Add(_Menu);
               

        alNode.Add(_UpdatePanel);
       

        return alNode;
    }

    void Menu_MenuItemClick(object sender, MenuEventArgs e)
    {
        hfShowNewElement.Value = "true"; 
    }
Re: Меню в UpdatePanel не исчезает после первого клика на it
От: Koss87  
Дата: 30.11.08 00:03
Оценка:
Здравствуйте, TheAteist

Туговато доходит суть задачи, если правельно понял, то
строиш дерево а нажатие на элементы ты обрабатываеш через сервер, вопрос а зачем нужны ява скрипты ?! есть такие клевые события онклик онмаусувер онмаусаут и тд. и тп.

с подгрузкой данныйх можно и работать без апдейт панела а например по средствам Библиотеки МS ASP.net AJAX тобиш подгрузку делать не с помощью частичной перезагрузки страници (веть работа с апдейт панел утрудняется тем что событие он пейдж лоад всеровно обрабатывается!!! ) а через внеполосный вызов функции которая лежит на сервере

и вопрос по поводу а у тебя сбой происходит по пречине апдейт панела или по какой?
если по причине апдейт панела (хотя нахождение нодов в них я не вижу потребности) то проверь в исходном тексте наодятся ли у тебя в разметке все твои ноды в суб тегах апдейт панела "контент", а также проверил де у тебя подевался такой контрол на форме как скриптменеджер!!! который просто необходим для функционирования аякса..

в еще я бы проверил как у тебя обрабатуються события на акшоне(проверь какие параметры передаються и почему именно после нажатия у тебя траблы, что происходит во время нажатия)!! и написалбы пару функция на яваскрипте!
Re[2]: Меню в UpdatePanel не исчезает после первого клика на
От: TheAteist  
Дата: 30.11.08 10:08
Оценка:
Здравствуйте, Koss87, Вы писали:

K>Здравствуйте, TheAteist


K>Туговато доходит суть задачи, если правельно понял, то

K>строиш дерево а нажатие на элементы ты обрабатываеш через сервер, вопрос а зачем нужны ява скрипты ?! есть такие клевые события онклик онмаусувер онмаусаут и тд. и тп.
Зачем мне делать событие онмаусувер если меню само такую возможность дает?
Апдейт панели я сделал для того чтоб при нажатии вся страничка не перезагружалась.
При нажатии на AddChild должен появится ModalPopup но из-за того что есть Апдейт панель, то ModalPopup не вызывается и поэтому я поставил ява скрипты, который при асинхроном постбеке имитирует нажатии кнопки и так появляется ModalPopup

K>с подгрузкой данныйх можно и работать без апдейт панела а например по средствам Библиотеки МS ASP.net AJAX тобиш подгрузку делать не с помощью частичной перезагрузки страници (веть работа с апдейт панел утрудняется тем что событие он пейдж лоад всеровно обрабатывается!!! ) а через внеполосный вызов функции которая лежит на сервере

Не понял как это, можно пример пожалуйста?

K>и вопрос по поводу а у тебя сбой происходит по пречине апдейт панела или по какой?

Я думаю да, т.к. без апдейт панелей все работает ок т.к. нет асинхронных постбеков.
K>если по причине апдейт панела (хотя нахождение нодов в них я не вижу потребности) то проверь в исходном тексте наодятся ли у тебя в разметке все твои ноды в суб тегах апдейт панела "контент", а также проверил де у тебя подевался такой контрол на форме как скриптменеджер!!! который просто необходим для функционирования аякса..
Так я же добавил
 <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" ScriptPath="scripts\MicrosoftAjaxLibrary">
        </ajaxToolkit:ToolkitScriptManager>



K>в еще я бы проверил как у тебя обрабатуються события на акшоне(проверь какие параметры передаються и почему именно после нажатия у тебя траблы, что происходит во время нажатия)!! и написалбы пару функция на яваскрипте!

Что например

Огромное спасибо за помощь
Re[3]: Меню в UpdatePanel не исчезает после первого клика на
От: Koss87  
Дата: 30.11.08 10:16
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Зачем мне делать событие онмаусувер если меню само такую возможность дает?

TA>Апдейт панели я сделал для того чтоб при нажатии вся страничка не перезагружалась.
TA>При нажатии на AddChild должен появится ModalPopup но из-за того что есть Апдейт панель, то ModalPopup не вызывается и поэтому я поставил ява скрипты, который при асинхроном постбеке имитирует нажатии кнопки и так появляется ModalPopup

теперь понятно *)

K>>с подгрузкой данныйх можно и работать без апдейт панела а например по средствам Библиотеки МS ASP.net AJAX тобиш подгрузку делать не с помощью частичной перезагрузки страници (веть работа с апдейт панел утрудняется тем что событие он пейдж лоад всеровно обрабатывается!!! ) а через внеполосный вызов функции которая лежит на сервере

TA>Не понял как это, можно пример пожалуйста?
это ссылка на туториал по библиотеке аякса выбери пункт Calling Static Methods in an ASP.NET Web Page
разберись что куда и тебе будет щастье))) никокого постбека нету все супер__)) данные передаютьься в формате JSON, прелесть если еще чтото не понятно уточни что)

TA>
TA> <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" ScriptPath="scripts\MicrosoftAjaxLibrary">
TA>        </ajaxToolkit:ToolkitScriptManager>
TA>

))))) ыыы просто у меня скрипт менеждер из покон веков лежит в области тегов АСП ))))
сорри не досмотрел




TA>Огромное спасибо за помощь
Re[4]: Меню в UpdatePanel не исчезает после первого клика на
От: TheAteist  
Дата: 30.11.08 21:12
Оценка:
Здравствуйте, Koss87, Вы писали:

K>Здравствуйте, TheAteist, Вы писали:


TA>>Зачем мне делать событие онмаусувер если меню само такую возможность дает?

TA>>Апдейт панели я сделал для того чтоб при нажатии вся страничка не перезагружалась.
TA>>При нажатии на AddChild должен появится ModalPopup но из-за того что есть Апдейт панель, то ModalPopup не вызывается и поэтому я поставил ява скрипты, который при асинхроном постбеке имитирует нажатии кнопки и так появляется ModalPopup

K>теперь понятно *)


K>>>с подгрузкой данныйх можно и работать без апдейт панела а например по средствам Библиотеки МS ASP.net AJAX тобиш подгрузку делать не с помощью частичной перезагрузки страници (веть работа с апдейт панел утрудняется тем что событие он пейдж лоад всеровно обрабатывается!!! ) а через внеполосный вызов функции которая лежит на сервере

TA>>Не понял как это, можно пример пожалуйста?
K>это ссылка на туториал по библиотеке аякса выбери пункт Calling Static Methods in an ASP.NET Web Page
K>разберись что куда и тебе будет щастье))) никокого постбека нету все супер__)) данные передаютьься в формате JSON, прелесть если еще чтото не понятно уточни что)

TA>>
TA>> <ajaxToolkit:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server" ScriptPath="scripts\MicrosoftAjaxLibrary">
TA>>        </ajaxToolkit:ToolkitScriptManager>
TA>>

K> ))))) ыыы просто у меня скрипт менеждер из покон веков лежит в области тегов АСП ))))
K>сорри не досмотрел

Очень полезная информация. Спасибо.
А если сделать чтоб при нажатии ява функция вызвалась.
Я вот так сделал
_Menu.Attributes["onclick"] = "myFunc()";

Но она не вызывается. Почему?



TA>>Огромное спасибо за помощь
Re[5]: Меню в UpdatePanel не исчезает после первого клика на
От: Koss87  
Дата: 30.11.08 21:25
Оценка:
Здравствуйте, TheAteist, Вы писали:

TA>Очень полезная информация. Спасибо.

TA>А если сделать чтоб при нажатии ява функция вызвалась.
TA>Я вот так сделал
TA>
TA>_Menu.Attributes["onclick"] = "myFunc()";
TA>

TA>Но она не вызывается. Почему?

м... может тебе не на меню надо вешать событие а на контролы которые в нем местяться? приведи пример нтмля резутьтируещего там де само меню, и приведи пример myFunc()

еще я думаю может стоит внутри этой функции поместить такую фигню как
...
alert();
...


может всетаки она обрабатываетсья и гдето пориться в процесе ?
З.Ы. для того чтобы понять причину нужно больше инфы ) попробуй более детально описчать ситуацию!
Re[6]: Меню в UpdatePanel не исчезает после первого клика на
От: TheAteist  
Дата: 30.11.08 21:48
Оценка:
Здравствуйте, Koss87, Вы писали:

K>Здравствуйте, TheAteist, Вы писали:


TA>>Очень полезная информация. Спасибо.

TA>>А если сделать чтоб при нажатии ява функция вызвалась.
TA>>Я вот так сделал
TA>>
TA>>_Menu.Attributes["onclick"] = "myFunc()";
TA>>

TA>>Но она не вызывается. Почему?

K>м... может тебе не на меню надо вешать событие а на контролы которые в нем местяться? приведи пример нтмля резутьтируещего там де само меню, и приведи пример myFunc()


K>еще я думаю может стоит внутри этой функции поместить такую фигню как

K>
K>...
K>alert();
K>...
K>


K>может всетаки она обрабатываетсья и гдето пориться в процесе ?

K>З.Ы. для
я сделала например
_Menu.Attributes["onclick"] = "alert(1);"

но alert не вызывается

Потом я попробывал использовать Calling Static Methods in an ASP.NET Web Page. Но не получилось.
Я убрал апдейт панели.
В коде в функции buildNodeContent добавил
_Menu.MenuItemClick += new MenuEventHandler(Menu_MenuItemClick);

а в скрипте следующее
<script runat="server">
        [WebMethod]
        static void Menu_MenuItemClick(object sender, MenuEventArgs e)
        {
            ...
        }

и тогда при нажатии на AddChilds например вызвалась бы Menu_MenuItemClick без постбека и я обработал бы нажатие,
но функция buildNodeContent не видет Menu_MenuItemClick и выдает ошибку при постбеке
Что я не то сделал?


того чтобы понять причину нужно больше инфы ) попробуй более детально описчать ситуацию!
Re[7]: Меню в UpdatePanel не исчезает после первого клика на
От: Koss87  
Дата: 01.12.08 00:57
Оценка:
Здравствуйте, TheAteist
выложи полностью всю страницу аспх и цс, а также яваскрипты..
Re[8]: Меню в UpdatePanel не исчезает после первого клика на
От: TheAteist  
Дата: 01.12.08 16:29
Оценка:
Здравствуйте, Koss87, Вы писали:

K>выложи полностью всю страницу аспх и цс, а также яваскрипты..


Во-первых хотел выразить тебе блогадарность за помощь

Я попытался присвоить event "onclick" в функции buildNodeContent так чтоб при нажатии на элементы меню(На "add child", на "update version", на "history") сработал alert,
но alert срабатывает только когда я нажимаю на Actions. Как же мне сделать?

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Copy of Copy of CNV.aspx.cs" Inherits="CNV" %>
<%@ Import Namespace="System.Web.Services" %>

<%@ Register Assembly="System.Web.Extensions" Namespace="System.Web.UI" TagPrefix="asp" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <link href="css/ModalDialogs.css" rel="stylesheet" type="text/css" />   
</head>
<body>    
    <form id="form1" runat="server">                
        <div>                   
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
            <asp:Table ID="Table1" runat="server"  CellPadding="0" CellSpacing="0" style="vertical-align: top">
            </asp:Table>
            <asp:Panel ID="pnlNewElement" runat="server" CssClass="modalPopup" Width="300px" Height="230px" style="display:none; overflow:auto;" >
                <table>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></td>
                        <td>
                            <asp:Label ID="lblElementName" runat="server" Text="name"></asp:Label></td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <asp:DropDownList ID="ddlElementKind" runat="server" DataSourceID="SQLdsElementKind"
                                DataTextField="sName" DataValueField="Id">
                            </asp:DropDownList>
                        </td>
                        <td>
                            <asp:Label ID="txtElementKind" runat="server" Text="kind"></asp:Label></td>
                    </tr>
                    <tr>
                        <td>
                        </td>
                        <td>
                            <asp:TextBox ID="txtDescription" runat="server"></asp:TextBox></td>
                        <td>
                            <asp:Label ID="lblDescription" runat="server" Text="desciption"></asp:Label></td>
                    </tr>
                </table>
                <asp:Button ID="btnCancel" runat="server" Text="cancel" />
                <asp:SqlDataSource ID="SQLdsElementKind" runat="server" ConnectionString="<%$ ConnectionStrings:esek %>"
                    SelectCommand="SELECT [Id], [sName] FROM [vElementKind]"></asp:SqlDataSource>                    
            </asp:Panel>
            <asp:Button ID="btnHiddenShowNewElement" runat="server" Text="Button" />
            
            <asp:HiddenField ID="hfShowNewElement" runat="server" />
            
            <ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender1" runat="server" TargetControlID="btnHiddenShowNewElement" PopupControlID="pnlNewElement" BackgroundCssClass="modalBackground" DropShadow="true" CancelControlID="btnCancel" >
            </ajaxToolkit:ModalPopupExtender>
        </div>
    </form>
</body>
</html>


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class CNV : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {       
        BuildTree();
     
    }
    void BuildTree()
    {                
        DataTable dtTree;
        DataView dvTree;
        ArrayList alNode;
        ConfigurationTree _ConfigurationTree;

        Table1.Controls.Clear();
        _ConfigurationTree = new ConfigurationTree(Table1);

        if ((dtTree = _ConfigurationTree.GetTree(Request["ProjId"])) == null)
        {
            showError(_ConfigurationTree.ErrorDescription);
            return;
        }

        if (dtTree.Rows.Count > 0)
        {
            dvTree = new DataView(dtTree);

            //Get records with TreeLevel = i
            dvTree.RowFilter = "nTLevel=1";

            alNode = buildNodeContent((string)dvTree[0].Row["ElementName"], (string)dvTree[0].Row["ElementVersionName"]);
            
            //Add Label
            _ConfigurationTree.BaseNode.AddControl((Label)alNode[0]);
            //Add Menu
            _ConfigurationTree.BaseNode.AddControl((Menu)alNode[1]);
            _ConfigurationTree.BaseNode.AddToStyle("background-color", "blue");
            _ConfigurationTree.BaseNode.AddToStyle("text-align", "center");
            buildNode(dtTree, _ConfigurationTree.BaseNode, dvTree[0].Row["ElementId"].ToString());
        }
    }
    /// <summary>
    /// Build node recursively
    /// </summary>
    /// <param name="dtTree"></param>
    /// <param name="Node"></param>
    /// <param name="strFatherElementId"></param>
    void buildNode(DataTable dtTree, TreeDiagramNode Node, string strFatherElementId)
    {
        ArrayList alNode;
        TreeDiagramNode subNode;
        DataView dvTree = new DataView(dtTree);

        //Filter all element that belong to FatherElementId
        dvTree.RowFilter = "uFatherElement='" + strFatherElementId + "'";
       
        for (int i = 0; i < dvTree.Count; i++)
        {            
            alNode = buildNodeContent((string)dvTree[i].Row["ElementName"], (string)dvTree[i].Row["ElementVersionName"]);

            subNode = Node.CreateChildNode();
            
            subNode.AddControl((Label)alNode[0]);
            subNode.AddControl((Menu)alNode[1]);
            subNode.AddToStyle("background-color", "blue");
            subNode.AddToStyle("text-align", "center");
            
            buildNode(dtTree, subNode, dvTree[i].Row["ElementId"].ToString());
        }
        
    }
    ArrayList buildNodeContent(string ElementName, string strVersion)
    {
        Label _Label = new Label();
        Menu _Menu;
        MenuItem _MenuItem;
        ArrayList alNode;

        _Label.Font.Bold = true;
        _Label.Font.Name = "Malgun Gothic";
        _Label.ForeColor = System.Drawing.Color.Black;
        _Label.Text = ElementName + " " + strVersion;

        _Menu = new Menu();

        _Menu.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicHorizontalOffset = 2;
        _Menu.Font.Name = "Verdana";
        _Menu.Font.Size = 10;
        _Menu.ForeColor = System.Drawing.Color.Teal;
        _Menu.StaticSubMenuIndent = new Unit(10, UnitType.Pixel);
        _Menu.Style.Add("direction", "rtl");
        _Menu.Style.Add("text-align", "right");
        _Menu.StaticSelectedStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.StaticMenuItemStyle.HorizontalPadding = new Unit(5, UnitType.Pixel);
        _Menu.StaticMenuItemStyle.VerticalPadding = new Unit(2, UnitType.Pixel);
        _Menu.DynamicHoverStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicHoverStyle.ForeColor = System.Drawing.Color.White;
        _Menu.DynamicMenuStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicSelectedStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.DynamicMenuItemStyle.HorizontalPadding = new Unit(5, UnitType.Pixel);
        _Menu.StaticHoverStyle.BackColor = System.Drawing.Color.LightSteelBlue;
        _Menu.StaticHoverStyle.ForeColor = System.Drawing.Color.White;
        
        _Menu.Attributes["onclick"] = "alert(1); return false;";

        _MenuItem = new MenuItem("actions", "actions");

        _Menu.Items.Add(_MenuItem);

        _MenuItem.ChildItems.Add(new MenuItem("history", "history"));
        _MenuItem.ChildItems.Add(new MenuItem("update version", "version"));
        _MenuItem.ChildItems.Add(new MenuItem("add child", "child"));        
       
       
        alNode = new ArrayList();               

        alNode.Add(_Label);
        alNode.Add(_Menu);

        return alNode;
    }

    

    /// <summary>
    /// Alert if any error occurred
    /// </summary>
    /// <param name="strMessage"></param>
    void showError(string strMessage)
    {
        //When the message contains characters like apostrophe or newline and etc. the javascipt error is occurred
        //Therefore store this message in hiddenfiled(added firstly to form) and alert from it
        HiddenField hfError = new HiddenField();
        hfError.Value = strMessage;
        hfError.ID = "hfError";

        Form.Controls.Add(hfError);
        this.ClientScript.RegisterStartupScript(this.GetType(), "Error", "alert(document.getElementById('" + hfError.UniqueID + "').value);", true);
    }    
}


    df
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.