Следующий код строит динамически 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
Туговато доходит суть задачи, если правельно понял, то
строиш дерево а нажатие на элементы ты обрабатываеш через сервер, вопрос а зачем нужны ява скрипты ?! есть такие клевые события онклик онмаусувер онмаусаут и тд. и тп.
с подгрузкой данныйх можно и работать без апдейт панела а например по средствам Библиотеки МS ASP.net AJAX тобиш подгрузку делать не с помощью частичной перезагрузки страници (веть работа с апдейт панел утрудняется тем что событие он пейдж лоад всеровно обрабатывается!!! ) а через внеполосный вызов функции которая лежит на сервере
и вопрос по поводу а у тебя сбой происходит по пречине апдейт панела или по какой?
если по причине апдейт панела (хотя нахождение нодов в них я не вижу потребности) то проверь в исходном тексте наодятся ли у тебя в разметке все твои ноды в суб тегах апдейт панела "контент", а также проверил де у тебя подевался такой контрол на форме как скриптменеджер!!! который просто необходим для функционирования аякса..
в еще я бы проверил как у тебя обрабатуються события на акшоне(проверь какие параметры передаються и почему именно после нажатия у тебя траблы, что происходит во время нажатия)!! и написалбы пару функция на яваскрипте!
Re[2]: Меню в UpdatePanel не исчезает после первого клика на
Здравствуйте, Koss87, Вы писали:
K>Здравствуйте, TheAteist
K>Туговато доходит суть задачи, если правельно понял, то K>строиш дерево а нажатие на элементы ты обрабатываеш через сервер, вопрос а зачем нужны ява скрипты ?! есть такие клевые события онклик онмаусувер онмаусаут и тд. и тп.
Зачем мне делать событие онмаусувер если меню само такую возможность дает?
Апдейт панели я сделал для того чтоб при нажатии вся страничка не перезагружалась.
При нажатии на AddChild должен появится ModalPopup но из-за того что есть Апдейт панель, то ModalPopup не вызывается и поэтому я поставил ява скрипты, который при асинхроном постбеке имитирует нажатии кнопки и так появляется ModalPopup
K>с подгрузкой данныйх можно и работать без апдейт панела а например по средствам Библиотеки МS ASP.net AJAX тобиш подгрузку делать не с помощью частичной перезагрузки страници (веть работа с апдейт панел утрудняется тем что событие он пейдж лоад всеровно обрабатывается!!! ) а через внеполосный вызов функции которая лежит на сервере
Не понял как это, можно пример пожалуйста?
K>и вопрос по поводу а у тебя сбой происходит по пречине апдейт панела или по какой?
Я думаю да, т.к. без апдейт панелей все работает ок т.к. нет асинхронных постбеков. K>если по причине апдейт панела (хотя нахождение нодов в них я не вижу потребности) то проверь в исходном тексте наодятся ли у тебя в разметке все твои ноды в суб тегах апдейт панела "контент", а также проверил де у тебя подевался такой контрол на форме как скриптменеджер!!! который просто необходим для функционирования аякса..
Так я же добавил
K>в еще я бы проверил как у тебя обрабатуються события на акшоне(проверь какие параметры передаються и почему именно после нажатия у тебя траблы, что происходит во время нажатия)!! и написалбы пару функция на яваскрипте!
Что например
Огромное спасибо за помощь
Re[3]: Меню в UpdatePanel не исчезает после первого клика на
Здравствуйте, 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>
Здравствуйте, 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>>
Здравствуйте, TheAteist, Вы писали:
TA>Очень полезная информация. Спасибо. TA>А если сделать чтоб при нажатии ява функция вызвалась. TA>Я вот так сделал TA>
TA>_Menu.Attributes["onclick"] = "myFunc()";
TA>
TA>Но она не вызывается. Почему?
м... может тебе не на меню надо вешать событие а на контролы которые в нем местяться? приведи пример нтмля резутьтируещего там де само меню, и приведи пример myFunc()
еще я думаю может стоит внутри этой функции поместить такую фигню как
...
alert();
...
может всетаки она обрабатываетсья и гдето пориться в процесе ?
З.Ы. для того чтобы понять причину нужно больше инфы ) попробуй более детально описчать ситуацию!
Re[6]: Меню в UpdatePanel не исчезает после первого клика на
Здравствуйте, Koss87, Вы писали:
K>Здравствуйте, TheAteist, Вы писали:
TA>>Очень полезная информация. Спасибо. TA>>А если сделать чтоб при нажатии ява функция вызвалась. TA>>Я вот так сделал 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);
и тогда при нажатии на AddChilds например вызвалась бы Menu_MenuItemClick без постбека и я обработал бы нажатие,
но функция buildNodeContent не видет Menu_MenuItemClick и выдает ошибку при постбеке
Что я не то сделал?
того чтобы понять причину нужно больше инфы ) попробуй более детально описчать ситуацию!
Re[7]: Меню в UpdatePanel не исчезает после первого клика на
Здравствуйте, Koss87, Вы писали:
K>выложи полностью всю страницу аспх и цс, а также яваскрипты..
Во-первых хотел выразить тебе блогадарность за помощь
Я попытался присвоить event "onclick" в функции buildNodeContent так чтоб при нажатии на элементы меню(На "add child", на "update version", на "history") сработал alert,
но alert срабатывает только когда я нажимаю на Actions. Как же мне сделать?