您现在的位置: 365建站网 > 365文章 > ExtAspNet应用技巧(十八) - 编辑菜单

ExtAspNet应用技巧(十八) - 编辑菜单

文章来源:365jz.com     点击数:1199    更新时间:2009-09-18 10:24   参与评论

界面截图

点击编辑在新窗口中弹出编辑页面:


注意模拟树的下拉列表,当前节点和当前节点的所有子节点都是不可选择的:


点击“保存并关闭”则会首先保存数据,然后关闭弹出窗口,之后回发父页面并更新Grid:


如果我修改了表单(排序由20->21),此时点击Window右上角的关闭按钮,会弹出提示框(这是ExtAspNet内置支持的特性):



ASPX标签定义

</>code

  1. <ext:PageManager ID="PageManager1" AutoSizePanelID="SimpleForm1" runat="server" />
  2. <ext:SimpleForm ID="SimpleForm1" ShowBorder="false" ShowHeader="false" runat="server"
  3. BodyPadding="5px" EnableBackgroundColor="true" Title="SimpleForm">
  4. <Toolbars>
  5. <ext:Toolbar ID="Toolbar1" runat="server">
  6. <Items>
  7. <ext:Button ID="btnClose" SystemIcon="Close" EnablePostBack="false" runat="server"
  8. Text="关闭">
  9. </ext:Button>
  10. <ext:ToolbarSeparator ID="ToolbarSeparator1" runat="server">
  11. </ext:ToolbarSeparator>
  12. <ext:Button ID="btnSaveClose" ValidateForms="SimpleForm1" SystemIcon="SaveClose"
  13. OnClick="btnSaveClose_Click" runat="server" Text="保存并关闭">
  14. </ext:Button>
  15. </Items>
  16. </ext:Toolbar>
  17. </Toolbars>
  18. <Items>
  19. <ext:TextBox ID="tbxName" runat="server" Label="名称" Required="true" ShowRedStar="true">
  20. </ext:TextBox>
  21. <ext:TextBox ID="tbxUrl" runat="server" Label="链接" Required="true" ShowRedStar="true">
  22. </ext:TextBox>
  23. <ext:CheckBox ID="cbxShow" runat="server" Label="显示">
  24. </ext:CheckBox>
  25. <ext:NumberBox ID="tbxSortIndex" Label="排序" Required="true" ShowRedStar="true" runat="server">
  26. </ext:NumberBox>
  27. <ext:DropDownList ID="ddlParentMenu" Label="父菜单" Required="true" ShowRedStar="true" runat="server">
  28. </ext:DropDownList>
  29. </Items>
  30. </ext:SimpleForm>


这里面的大部分技巧在上一篇文章 《ExtAspNet应用技巧(十七) - 新增菜单》 中都已经有所介绍。


页面初始化代码

</>code

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3. if (!IsPostBack)
  4. {
  5. LoadData();
  6. }
  7. }
  8. private void LoadData()
  9. {
  10. btnClose.OnClientClick = ExtAspNet.ActiveWindow.GetConfirmFormModifiedClosePostBackReference();
  11. int menuId = GetQueryIntValue("id");
  12. XMenu menu = XMenu.FetchByID(menuId);
  13. if (menu == null)
  14. {
  15. // 参数错误,首先弹出Alert对话框然后关闭弹出窗口
  16. ExtAspNet.Alert.Show("参数错误!", String.Empty, ExtAspNet.ActiveWindow.GetCloseReference());
  17. return;
  18. }
  19. tbxName.Text = menu.Name;
  20. tbxUrl.Text = menu.NavigateUrl;
  21. tbxSortIndex.Text = menu.SortIndex.ToString();
  22. cbxShow.Checked = menu.Show;
  23. // 绑定下拉列表
  24. BindDDL(menu);
  25. }


在介绍这段代码之前,我们先回忆下父页面中的Grid的编辑链接是如何定义的:

</>code

  1. <ext:WindowField Text="编辑" WindowID="Window1" Title="编辑" DataIFrameUrlFields="Id"
  2. DataIFrameUrlFormatString="~/admin/menu_edit.aspx?id={0}" Width="50px" />


也就是说,当打开此编辑菜单的页面时,URL应该类似如下形式:http://localhost/appbox/admin/menu_edit.aspx?id=6

所以,我们首先通过定义在PageBase中的GetQueryIntValue方法,获取URL中id值:

</>code

  1. protected string GetQueryValue(string queryKey)
  2. {
  3. return Request.QueryString[queryKey];
  4. }
  5. protected int GetQueryIntValue(string queryKey)
  6. {
  7. int queryIntValue = -1;
  8. try
  9. {
  10. queryIntValue = Convert.ToInt32(Request.QueryString[queryKey]);
  11. }
  12. catch (Exception)
  13. {
  14. // TODO
  15. }
  16. return queryIntValue;
  17. }



之后再来看下这段代码:

</>code

  1. XMenu menu = XMenu.FetchByID(menuId);
  2. if (menu == null)
  3. {
  4. // 参数错误,首先弹出Alert对话框然后关闭弹出窗口
  5. ExtAspNet.Alert.Show("参数错误!", String.Empty, ExtAspNet.ActiveWindow.GetCloseReference());
  6. return;
  7. }

我们可以把这段代码直译为,如果对应的menuId不存在,则首先弹出Alert对话框,在用户点击对话框的确认按钮后,关闭当前弹出的窗口(ActiveWindow)。
对应的页面的效果为(是不是很酷):







绑定下拉列表代码


这段代码将是本章中最出彩的一段,我们要完成的功能如下(可以在后面看到对应的代码实现):
1. 从数据库查询所有的菜单,按照SortIndex由小到大排序,生成XMenuCollection(这是SubSonic生成的数据库表映射实体类)。
2. 通过XMenuHelper.GetMyMenuCollection静态函数将此对象转换为List<MyMenu>(内部已经计算好TreeLevel和IsTreeLeaf)。
3. 添加根节点(所有节点的TreeLevel加一)。
4. 设置当前节点以及当前节点的所有子节点都不可选择(这是通过ExtAspNet支持的方法来做的)。
5. 绑定模拟树的下拉列表。
6. 选中下拉列表中当前节点的父节点

来看下对应的代码实现:

</>code

  1. private void BindDDL(XMenu menu)
  2. {
  3. XMenuCollection menus = new Select().From<XMenu>()
  4. .OrderAsc(XMenu.SortIndexColumn.ColumnName)
  5. .ExecuteAsCollection<XMenuCollection>();
  6. List<MyMenu> newMenus = XMenuHelper.GetMyMenuCollection(menus);
  7. // 所有节点的TreeLevel加一,然后添加根节点
  8. foreach (MyMenu myMenu in newMenus)
  9. {
  10. myMenu.TreeLevel += 1;
  11. }
  12. MyMenu rootMenu = new MyMenu();
  13. rootMenu.Name = "==根节点==";
  14. rootMenu.Id = 0;
  15. rootMenu.TreeLevel = 0;
  16. newMenus.Insert(0, rootMenu);
  17. // 本节点不可点击(也就是说当前节点不可能是当前节点的父节点)
  18. // 并且本节点的所有子节点也不可点击,你想如果当前节点跑到子节点的子节点,那么这些子节点就从树上消失了
  19. bool startChileNode = false;
  20. int currentMenuTreeLevel = 0;
  21. foreach (MyMenu myMenu in newMenus)
  22. {
  23. if (myMenu.Id == menu.Id)
  24. {
  25. currentMenuTreeLevel = myMenu.TreeLevel;
  26. myMenu.Enabled = false;
  27. startChileNode = true;
  28. }
  29. else
  30. {
  31. if (startChileNode)
  32. {
  33. if (myMenu.TreeLevel > currentMenuTreeLevel)
  34. {
  35. myMenu.Enabled = false;
  36. }
  37. else
  38. {
  39. startChileNode = false;
  40. }
  41. }
  42. }
  43. }
  44. // 绑定到下拉列表(启用模拟树功能和不可选择项功能)
  45. ddlParentMenu.EnableSimulateTree = true;
  46. ddlParentMenu.DataTextField = "Name";
  47. ddlParentMenu.DataValueField = "Id";
  48. ddlParentMenu.DataSimulateTreeLevelField = "TreeLevel";
  49. ddlParentMenu.DataEnableSelectField = "Enabled";
  50. ddlParentMenu.DataSource = newMenus;
  51. ddlParentMenu.DataBind();
  52. // 选中当前节点的父节点
  53. ddlParentMenu.SelectedValue = menu.ParentMenuId.ToString();
  54. }



页面事件处理代码

</>code

  1. protected void btnSaveClose_Click(object sender, EventArgs e)
  2. {
  3. int menuId = GetQueryIntValue("id");
  4. XMenu menu = XMenu.FetchByID(menuId);
  5. menu.Name = tbxName.Text.Trim();
  6. menu.NavigateUrl = tbxUrl.Text.Trim();
  7. menu.SortIndex = Convert.ToInt32(tbxSortIndex.Text.Trim());
  8. menu.Show = cbxShow.Checked;
  9. menu.ParentMenuId = Convert.ToInt32(ddlParentMenu.SelectedValue);
  10. menu.Save(User.Identity.Name);
  11. ExtAspNet.Alert.Show("保存成功!", String.Empty, ExtAspNet.ActiveWindow.GetClosePostBackReference());
  12. }




下一章,我们将会介绍如何日志管理模块。


下载全部源代码




如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (1199人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号