從零開始編寫自己的C#框架(18)——Web層后端權限模塊——菜單管理


  從本章開始,主要講解的是頁面中對框架相關功能的調用方法,比如列表頁面(又分為有層次感列表和普通列表)、編輯頁面、多標簽頁面等,只要熟悉了這些函數的使用方法,那么開發起來就會很便捷了。

 

  1、如圖先創建菜單列表與編輯頁面

   

   MenuInfoList.aspx

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MenuInfoList.aspx.cs" Inherits="Solution.Web.Managers.WebManage.Systems.Powers.MenuInfoList" %>
 2 
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 4 <html xmlns="http://www.w3.org/1999/xhtml">
 5 <head id="Head1" runat="server">
 6     <title>菜單(頁面)列表</title>
 7 </head>
 8 <body>
 9     <form id="form1" runat="server">
10     <f:pagemanager id="PageManager1" runat="server" />
11     <f:panel id="Panel1" runat="server" title="菜單(頁面)列表" enableframe="false" bodypadding="10px"
12         enablecollapse="True">
13         <toolbars>
14             <f:Toolbar ID="toolBar" runat="server">
15                 <Items>
16                     <f:Button ID="ButtonRefresh" runat="server" Text="刷新" Icon="ArrowRefresh" OnClick="ButtonRefresh_Click" CssClass="inline"></f:Button>
17                     <f:Button ID="ButtonAdd" runat="server" Text="添加" Icon="Add" OnClick="ButtonAdd_Click"></f:Button>
18                     <f:Button ID="ButtonSearch" runat="server" Text="查詢" Icon="Magnifier" OnClick="ButtonSearch_Click"></f:Button>
19                     <%--<f:Button ID="ButtonEdit" runat="server" Text="編輯" Icon="BulletEdit" OnClick="ButtonEdit_Click"
20                         OnClientClick="if(!F('Panel1_Grid1').getSelectionModel().hasSelection()|| F('Panel1_Grid1').getSelectionModel().getCount()>=2){F.alert('您沒有選擇編輯項或只能選擇一項進行編輯!'); return false; }">
21                    </f:Button>--%> 
22                     <f:Button ID="ButtonSaveAutoSort" runat="server" Text="自動排序" Icon="ArrowJoin" OnClick="ButtonSaveAutoSort_Click" ConfirmTitle="自動排序提示" ConfirmText="是否對所有數據進行自動排序?"></f:Button>
23                     <f:Button ID="ButtonSaveSort" runat="server" Text="保存排序" Icon="Disk" OnClick="ButtonSaveSort_Click"></f:Button>
24                     <f:Button ID="ButtonDelete" runat="server" Text="刪除" Icon="Delete" OnClick="ButtonDelete_Click" ConfirmTitle="刪除提示" ConfirmText="是否刪除記錄?" 
25                         OnClientClick="if (!F('Panel1_Grid1').getSelectionModel().hasSelection() ) { F.alert('刪除時必須選擇一條將要刪除的記錄!'); return false; }  if (F('Panel1_Grid1').getSelectionModel().getCount() >= 2) { F.alert('只能選擇一條記錄進行刪除!');return false; }">
26                     </f:Button>
27                 </Items>
28             </f:Toolbar>
29         </toolbars>
30         <items>
31              <f:SimpleForm ID="SimpleForm1" BodyPadding="5px" runat="server" EnableFrame="false" EnableCollapse="true"
32                 ShowBorder="True" ShowHeader="False">
33                 <Items>
34                     <f:DropDownList Label="菜單選擇" runat="server" ID="ddlParentId" Width="250px"></f:DropDownList>
35                 </Items>
36             </f:SimpleForm>
37             <f:Grid ID="Grid1" Title="菜單列表" EnableFrame="false" EnableCollapse="true" AllowSorting="true" SortField="Depth" SortDirection="ASC"
38             PageSize="15" ShowBorder="true" ShowHeader="true" AllowPaging="true" runat="server" EnableCheckBoxSelect="True" DataKeyNames="Id" EnableColumnLines="true"
39             OnPageIndexChange="Grid1_PageIndexChange" OnPreRowDataBound="Grid1_PreRowDataBound" OnRowCommand="Grid1_RowCommand">
40                 <Columns>
41                     <f:RowNumberField />
42                     <f:BoundField Width="180px" DataField="Name" DataFormatString="{0}" DataSimulateTreeLevelField="Depth" HeaderText="菜單(頁面)名" />
43                     <f:BoundField DataField="Url" HeaderText="訪問路徑" ExpandUnusedSpace="true" />
44                     <f:TemplateField HeaderText="排序" Width="100px">
45                         <ItemTemplate>
46                             <asp:TextBox ID="tbSort" runat="server" Width="50px" Text='<%# Eval("Sort") %>' AutoPostBack="false"></asp:TextBox>
47                         </ItemTemplate>
48                     </f:TemplateField>
49                     <f:LinkButtonField HeaderText="是否顯示" Icon="BulletCross" TextAlign="Center" ToolTip="點擊修改是否顯示" ColumnID="IsDisplay" CommandName="IsDisplay" />
50                     <f:LinkButtonField HeaderText="是否頁面" Icon="BulletCross" TextAlign="Center" ToolTip="點擊修改是否頁面" ColumnID="IsMenu" CommandName="IsMenu" />
51                     <f:BoundField DataField="Depth" HeaderText="級別層次" TextAlign="Center" />
52                     <f:LinkButtonField HeaderText="操作" TextAlign="Center" ToolTip="點擊修改當前記錄" ColumnID="ButtonEdit" CommandName="ButtonEdit" />
53                 </Columns>
54             </f:Grid>
55             <f:Label runat="server" ID="lblSpendingTime" Text=""></f:Label>
56             <f:HiddenField runat="server" ID="SortColumn" Text="Id"></f:HiddenField>
57         </items>
58     </f:panel>
59     <f:window id="Window1" width="480px" height="340px" icon="TagBlue" title="編輯" hidden="True"
60         enablemaximize="True" closeaction="HidePostBack" onclose="Window1_Close" enablecollapse="true"
61         runat="server" enableresize="true" bodypadding="5px" enableframe="True" iframeurl="about:blank"
62         enableiframe="true" enableclose="true" plain="false" ismodal="True" enableconfirmonclose="True">
63     </f:window>
64     </form>
65 </body>
66 </html>
View Code

  MenuInfoList.aspx.cs

  1 using System;
  2 using System.Collections.Generic;
  3 using DotNet.Utilities;
  4 using FineUI;
  5 using Solution.DataAccess.DataModel;
  6 using Solution.Logic.Managers;
  7 using Solution.Web.Managers.WebManage.Application;
  8 
  9 namespace Solution.Web.Managers.WebManage.Systems.Powers
 10 {
 11     public partial class MenuInfoList : PageBase
 12     {
 13         #region Page_Load
 14         protected void Page_Load(object sender, EventArgs e)
 15         {
 16             if (!IsPostBack)
 17             {
 18                 //綁定下拉列表
 19                 MenuInfoBll.GetInstence().BandDropDownList(this, ddlParentId);
 20 
 21                 LoadData();
 22             }
 23         }
 24         #endregion
 25 
 26         #region 接口函數,用於UI頁面初始化,給邏輯層對象、列表等對象賦值
 27         public override void Init()
 28         {
 29             //邏輯對象賦值
 30             bll = MenuInfoBll.GetInstence();
 31             //表格對象賦值
 32             grid = Grid1;
 33         }
 34         #endregion
 35 
 36         #region 加載數據
 37         /// <summary>讀取數據</summary>
 38         public override void LoadData()
 39         {
 40             //設置排序
 41             if (sortList == null)
 42             {
 43                 Sort();
 44             }
 45 
 46             //綁定Grid表格
 47             bll.BindGrid(Grid1, InquiryCondition(), sortList);
 48         }
 49 
 50         /// <summary>
 51         /// 查詢條件
 52         /// </summary>
 53         /// <returns></returns>
 54         private int InquiryCondition()
 55         {
 56             int value = 0;
 57 
 58             //選擇菜單
 59             if (ddlParentId.SelectedValue != "0")
 60             {
 61                 value = ConvertHelper.Cint0(ddlParentId.SelectedValue);
 62             }
 63             return value;
 64         }
 65 
 66         #region 排序
 67         /// <summary>
 68         /// 頁面表格綁定排序
 69         /// </summary>
 70         public void Sort()
 71         {
 72             //設置排序
 73             sortList = new List<string>();
 74             sortList.Add(MenuInfoTable.Depth + " asc");
 75             sortList.Add(MenuInfoTable.Sort + " asc");
 76         }
 77         #endregion
 78 
 79         #endregion
 80         
 81         #region 列表屬性綁定
 82 
 83         #region 列表按鍵綁定——修改列表控件屬性
 84         /// <summary>
 85         /// 列表按鍵綁定——修改列表控件屬性
 86         /// </summary>
 87         /// <param name="sender"></param>
 88         /// <param name="e"></param>
 89         protected void Grid1_PreRowDataBound(object sender, FineUI.GridPreRowEventArgs e)
 90         {
 91             //綁定是否顯示狀態列
 92             GridRow gr = Grid1.Rows[e.RowIndex];
 93             if (((System.Data.DataRowView)(gr.DataItem)).Row.Table.Rows[e.RowIndex][MenuInfoTable.IsDisplay].ToString() == "0")
 94             {
 95                 var lbf = Grid1.FindColumn("IsDisplay") as LinkButtonField;
 96                 lbf.Icon = Icon.BulletCross;
 97                 lbf.CommandArgument = "1";
 98             }
 99             else
100             {
101                 var lbf = Grid1.FindColumn("IsDisplay") as LinkButtonField;
102                 lbf.Icon = Icon.BulletTick;
103                 lbf.CommandArgument = "0";
104             }
105 
106             //綁定是否菜單列
107             if (((System.Data.DataRowView)(gr.DataItem)).Row.Table.Rows[e.RowIndex][MenuInfoTable.IsMenu].ToString() == "0")
108             {
109                 var lbf = Grid1.FindColumn("IsMenu") as LinkButtonField;
110                 lbf.Icon = Icon.BulletCross;
111                 lbf.CommandArgument = "1";
112             }
113             else
114             {
115                 var lbf = Grid1.FindColumn("IsMenu") as LinkButtonField;
116                 lbf.Icon = Icon.BulletTick;
117                 lbf.CommandArgument = "0";
118             }
119 
120             //綁定是否編輯列
121             var lbfEdit = Grid1.FindColumn("ButtonEdit") as LinkButtonField;
122             lbfEdit.Text = "編輯";
123             //lbfEdit.Enabled = MenuInfoBll.GetInstence().CheckControlPower(this, "ButtonEdit");
124         }
125         #endregion
126 
127         #region Grid點擊事件
128         /// <summary> 
129         /// Grid點擊事件
130         /// </summary>
131         /// <param name="sender"></param>
132         /// <param name="e"></param>
133         protected void Grid1_RowCommand(object sender, FineUI.GridCommandEventArgs e)
134         {
135             GridRow gr = Grid1.Rows[e.RowIndex];
136             //獲取主鍵ID
137             object id = gr.DataKeys[0];
138 
139             switch (e.CommandName)
140             {
141                 case "IsDisplay":
142                     //更新狀態
143                     MenuInfoBll.GetInstence().UpdateIsDisplay(this, ConvertHelper.Cint0(id), ConvertHelper.Cint0(e.CommandArgument));
144                     //重新加載
145                     LoadData();
146 
147                     break;
148                 case "IsMenu":
149                     //更新狀態
150                     MenuInfoBll.GetInstence().UpdateIsMenu(this, ConvertHelper.Cint0(id), ConvertHelper.Cint0(e.CommandArgument));
151                     //重新加載
152                     LoadData();
153 
154                     break;
155                 case "ButtonEdit":
156                     Window1.IFrameUrl = "MenuInfoEdit.aspx?Id=" + id + "&" + MenuInfoBll.GetInstence().PageUrlEncryptStringNoKey(id + "");
157                     Window1.Hidden = false;
158 
159                     break;
160             }
161         }
162         #endregion
163 
164         #endregion
165 
166         #region 添加新記錄
167         /// <summary>
168         /// 添加新記錄
169         /// </summary>
170         public override void Add()
171         {
172             Window1.IFrameUrl = "MenuInfoEdit.aspx?" + MenuInfoBll.GetInstence().PageUrlEncryptString();
173             Window1.Hidden = false;
174         }
175         #endregion
176 
177         #region 編輯記錄
178         /// <summary>
179         /// 編輯記錄
180         /// </summary>
181         public override void Edit()
182         {
183             string id = GridViewHelper.GetSelectedKey(Grid1, true);
184 
185             Window1.IFrameUrl = "MenuInfoEdit.aspx?Id=" + id + "&" + MenuInfoBll.GetInstence().PageUrlEncryptStringNoKey(id);
186             Window1.Hidden = false;
187         }
188         #endregion
189 
190         #region 刪除記錄
191         /// <summary>
192         /// 刪除記錄
193         /// </summary>
194         /// <returns></returns>
195         public override string Delete()
196         {
197             //獲取要刪除的ID
198             int id = ConvertHelper.Cint0(GridViewHelper.GetSelectedKey(Grid1, true));
199             
200             //如果沒有選擇記錄,則直接退出
201             if (id == 0)
202             {
203                 return "請選擇要刪除的記錄。";
204             }
205 
206             try
207             {
208                 //刪除前判斷一下
209                 if (MenuInfoBll.GetInstence().Exist(x => x.ParentId == id))
210                 {
211                     return "刪除失敗,本菜單下面存在子菜單,不能直接刪除!";
212                 }
213                 //刪除前判斷一下
214                 if (PagePowerSignBll.GetInstence().Exist(x => x.MenuInfo_Id == id))
215                 {
216                     return "刪除失敗,本菜單已綁定有頁面控件權限標志,不能直接刪除!";
217                 }
218 
219                 //刪除記錄
220                 bll.Delete(this, id);
221 
222                 return "刪除編號ID為[" + id + "]的數據記錄成功。";
223             }
224             catch (Exception e)
225             {
226                 string result = "嘗試刪除編號ID為[" + id + "]的數據記錄失敗!";
227 
228                 //出現異常,保存出錯日志信息
229                 CommonBll.WriteLog(result, e);
230 
231                 return result;
232             }
233         }
234         #endregion
235 
236     }
237 }
View Code

 

  先上列表頁面運行效果圖

  

  2、列表頁代碼說明

  在頁面中,可以看到這條工具條,我們打開aspx頁面,找到<f:Toolbar ID="toolBar" runat="server"></f:Toolbar>標簽

 1         <f:Toolbar ID="toolBar" runat="server">
 2                 <Items>
 3                     <f:Button ID="ButtonRefresh" runat="server" Text="刷新" Icon="ArrowRefresh" OnClick="ButtonRefresh_Click" CssClass="inline"></f:Button>
 4                     <f:Button ID="ButtonAdd" runat="server" Text="添加" Icon="Add" OnClick="ButtonAdd_Click"></f:Button>
 5                     <f:Button ID="ButtonSearch" runat="server" Text="查詢" Icon="Magnifier" OnClick="ButtonSearch_Click"></f:Button>
 6                     <%--<f:Button ID="ButtonEdit" runat="server" Text="編輯" Icon="BulletEdit" OnClick="ButtonEdit_Click"
 7                         OnClientClick="if(!F('Panel1_Grid1').getSelectionModel().hasSelection()|| F('Panel1_Grid1').getSelectionModel().getCount()>=2){F.alert('您沒有選擇編輯項或只能選擇一項進行編輯!'); return false; }">
 8                    </f:Button>--%> 
 9                     <f:Button ID="ButtonSaveAutoSort" runat="server" Text="自動排序" Icon="ArrowJoin" OnClick="ButtonSaveAutoSort_Click" ConfirmTitle="自動排序提示" ConfirmText="是否對所有數據進行自動排序?"></f:Button>
10                     <f:Button ID="ButtonSaveSort" runat="server" Text="保存排序" Icon="Disk" OnClick="ButtonSaveSort_Click"></f:Button>
11                     <f:Button ID="ButtonDelete" runat="server" Text="刪除" Icon="Delete" OnClick="ButtonDelete_Click" ConfirmTitle="刪除提示" ConfirmText="是否刪除記錄?" 
12                         OnClientClick="if (!F('Panel1_Grid1').getSelectionModel().hasSelection() ) { F.alert('刪除時必須選擇一條將要刪除的記錄!'); return false; }  if (F('Panel1_Grid1').getSelectionModel().getCount() >= 2) { F.alert('只能選擇一條記錄進行刪除!');return false; }">
13                     </f:Button>
14                 </Items>
15             </f:Toolbar>

  在里面放置的按鍵都會在這里顯示出來,這個標簽的Id必須命名為toolBar,因為在PageBase這個父類的初始化函數OnInit中有下面這段代碼,會自動為放在這里的按鍵進行權限判斷處理,檢查當前用戶是否有對應按鍵的操作權限,沒有操作權限的按鍵自動禁用掉,這樣的話我們在開發時就不用為這些按鍵權限一個個進行賦值,做這么多麻煩的操作了

(灰白色的為已禁用按鍵)

 1               #region 設置頁面按鍵權限
 2                 try
 3                 {
 4                     //定義按鍵控件
 5                     Control btnControl = null;
 6                     //找到頁面放置按鍵控件的位置
 7                     ControlCollection controls = MenuInfoBll.GetInstence().GetControls(this.Controls, "toolBar");
 8                     //逐個讀取出來
 9                     for (int i = 0; i < controls.Count; i++)
10                     {
11                         //取出控件
12                         btnControl = controls[i];
13                         //判斷是否除了刷新、查詢和關閉以外的按鍵
14                         if (btnControl.ID != "ButtonRefresh" && btnControl.ID != "ButtonSearch" && btnControl.ID != "ButtonClose" && btnControl.ID != "ButtonReset")
15                         {
16                             //是的話檢查該按鍵當前用戶是否有控件權限,沒有的話則禁用該按鍵
17                             ((FineUI.Button)btnControl).Enabled = MenuInfoBll.GetInstence().CheckControlPower(this, btnControl.ID);
18                         }
19                     }
20                 }
21                 catch (Exception) { }
22                 #endregion        

 

  對於表格的綁定也很方便,我們想顯示那幾列,只要將字段綁定到列表中就可以了,修改字段名稱或添加新字段時,只需要對數據層與邏輯層的代碼重新一鍵生成后,不用修改其他代碼,這里重新綁定就可以顯示出來,非常方便,大家可以試試刪除下面代碼中的幾列或在數據庫添加新字段測試一下就明白了。

 1           <f:Grid ID="Grid1" Title="菜單列表" EnableFrame="false" EnableCollapse="true" AllowSorting="true" SortField="Depth" SortDirection="ASC"
 2             PageSize="15" ShowBorder="true" ShowHeader="true" AllowPaging="true" runat="server" EnableCheckBoxSelect="True" DataKeyNames="Id" EnableColumnLines="true"
 3             OnPageIndexChange="Grid1_PageIndexChange" OnPreRowDataBound="Grid1_PreRowDataBound" OnRowCommand="Grid1_RowCommand">
 4                 <Columns>
 5                     <f:RowNumberField />
 6                     <f:BoundField Width="180px" DataField="Name" DataFormatString="{0}" DataSimulateTreeLevelField="Depth" HeaderText="菜單(頁面)名" />
 7                     <f:BoundField DataField="Url" HeaderText="訪問路徑" ExpandUnusedSpace="true" />
 8                     <f:TemplateField HeaderText="排序" Width="100px">
 9                         <ItemTemplate>
10                             <asp:TextBox ID="tbSort" runat="server" Width="50px" Text='<%# Eval("Sort") %>' AutoPostBack="false"></asp:TextBox>
11                         </ItemTemplate>
12                     </f:TemplateField>
13                     <f:LinkButtonField HeaderText="是否顯示" Icon="BulletCross" TextAlign="Center" ToolTip="點擊修改是否顯示" ColumnID="IsDisplay" CommandName="IsDisplay" />
14                     <f:LinkButtonField HeaderText="是否頁面" Icon="BulletCross" TextAlign="Center" ToolTip="點擊修改是否頁面" ColumnID="IsMenu" CommandName="IsMenu" />
15                     <f:BoundField DataField="Depth" HeaderText="級別層次" TextAlign="Center" />
16                     <f:LinkButtonField HeaderText="操作" TextAlign="Center" ToolTip="點擊修改當前記錄" ColumnID="ButtonEdit" CommandName="ButtonEdit" />
17                 </Columns>
18             </f:Grid>    

  對於列表的事件,在Grid標簽中,敲一下空格就會彈出可以使用的事件列表出來,只要綁定對應名稱后,在cs文件中添加對應函數就能直接調用,具體大家可以去FineUI官網查看使用例子

  

   列表頁中,可以看到<f:Label runat="server" ID="lblSpendingTime" Text=""></f:Label>這個標簽,這是用來顯示列表執行時間的,只需要放上它就會自動顯示列表執行時間:

  <f:window>標簽是用來處理顯示和隱藏彈出編輯窗口用的,大家可以根據需要自己修改編輯寬與高

 

 

  由於MenuInfoList.aspx.cs必須繼承PageBase類,所以我們必須實現Init()與LoadData()這兩個函數

  在列表頁面中,我們需要實現Init()函數,並為當前頁面所調用的邏輯層對象與表格對象進行賦值,如下面代碼。賦值后不少功能就自動實現了,具體請看后面的演示效果。

1         #region 接口函數,用於UI頁面初始化,給邏輯層對象、列表等對象賦值
2         public override void Init()
3         {
4             //邏輯對象賦值
5             bll = MenuInfoBll.GetInstence();
6             //表格對象賦值
7             grid = Grid1;
8         }
9         #endregion

  由於本列表頁面要顯示的是有層次感的列表,所以Sort調用的是自定義的代碼(有層次感的列表排序必須先用Depth進行升序排序后,再用Sort排序),同時也去掉了列表中點擊表頭排序的功能(會弄亂層次感列表)

  對於表格的綁定、翻頁等功能,我們在邏輯層已生成對應的函數了,所以這里直接調用就可以了,bll.BindGrid(Grid1, InquiryCondition(), sortList);這個是專門用於有層次感列表的

  為了保持列表的層次感,所以查詢條件是直接綁定根級別的菜單

 1         #region 加載數據
 2         /// <summary>讀取數據</summary>
 3         public override void LoadData()
 4         {
 5             //設置排序
 6             if (sortList == null)
 7             {
 8                 Sort();
 9             }
10 
11             //綁定Grid表格
12             bll.BindGrid(Grid1, InquiryCondition(), sortList);
13         }
14 
15         /// <summary>
16         /// 查詢條件
17         /// </summary>
18         /// <returns></returns>
19         private int InquiryCondition()
20         {
21             int value = 0;
22 
23             //選擇菜單
24             if (ddlParentId.SelectedValue != "0")
25             {
26                 value = ConvertHelper.Cint0(ddlParentId.SelectedValue);
27             }
28             return value;
29         }
30 
31         #region 排序
32         /// <summary>
33         /// 頁面表格綁定排序
34         /// </summary>
35         public void Sort()
36         {
37             //設置排序
38             sortList = new List<string>();
39             sortList.Add(MenuInfoTable.Depth + " asc");
40             sortList.Add(MenuInfoTable.Sort + " asc");
41         }
42         #endregion
43 
44         #endregion

   查詢效果圖

  

 

  保存排序與自動排序功能(注意觀察菜單名稱與排序值的變化)

  在cs代碼中,可以看到,里面並沒有保存排序與自動排序的代碼,因為在父類中已對這些常用功能進行了封裝,所以我們在實現Init()函數時對邏輯層對象與表格對象進行賦值后,就會自動擁有這些功能

  未修改

  

  修改排序值

  

  點擊保存排序按鍵

  

  點擊自動排序按鍵

  

  當然對於有父Id的列表自動排序,無需要編寫代碼就會自動實現了,而對於沒有父Id字段的表,我們就需要重寫SaveAutoSort()函數來實現,請看下面重寫代碼

 1         /// <summary>
 2         /// 保存自動排序
 3         /// </summary>
 4         public override void SaveAutoSort()
 5         {
 6             if (bll == null)
 7             {
 8                 Alert.ShowInParent("保存失敗", "邏輯層對象為null,請聯系開發人員給當前頁面的邏輯層對象賦值");
 9                 return;
10             }
11 
12             if (bll.UpdateAutoSort(this))
13             {
14                 Alert.ShowInParent("保存成功", "保存自動排序成功", "window.location.reload();");
15             }
16             else
17             {
18                 Alert.ShowInParent("保存失敗", "保存自動排序失敗");
19             }
20         }

  根據需要,還可以在UpdateAutoSort函數中加上不同的參數,來實現不同條件下自動排序的效果

 

  列表屬性綁定說明

  在列表中,我們可以看到是否顯示與是否頁面的圖像是可以點擊的,點一下就可以將其改變,如下圖

  點擊之前

  

  點擊之后

  

  這個就是在下面代碼中進行綁定的

 1         #region 列表屬性綁定
 2 
 3         #region 列表按鍵綁定——修改列表控件屬性
 4         /// <summary>
 5         /// 列表按鍵綁定——修改列表控件屬性
 6         /// </summary>
 7         /// <param name="sender"></param>
 8         /// <param name="e"></param>
 9         protected void Grid1_PreRowDataBound(object sender, FineUI.GridPreRowEventArgs e)
10         {
11             //綁定是否顯示狀態列
12             GridRow gr = Grid1.Rows[e.RowIndex];
13             if (((System.Data.DataRowView)(gr.DataItem)).Row.Table.Rows[e.RowIndex][MenuInfoTable.IsDisplay].ToString() == "0")
14             {
15                 var lbf = Grid1.FindColumn("IsDisplay") as LinkButtonField;
16                 lbf.Icon = Icon.BulletCross;
17                 lbf.CommandArgument = "1";
18             }
19             else
20             {
21                 var lbf = Grid1.FindColumn("IsDisplay") as LinkButtonField;
22                 lbf.Icon = Icon.BulletTick;
23                 lbf.CommandArgument = "0";
24             }
25 
26             //綁定是否菜單列
27             if (((System.Data.DataRowView)(gr.DataItem)).Row.Table.Rows[e.RowIndex][MenuInfoTable.IsMenu].ToString() == "0")
28             {
29                 var lbf = Grid1.FindColumn("IsMenu") as LinkButtonField;
30                 lbf.Icon = Icon.BulletCross;
31                 lbf.CommandArgument = "1";
32             }
33             else
34             {
35                 var lbf = Grid1.FindColumn("IsMenu") as LinkButtonField;
36                 lbf.Icon = Icon.BulletTick;
37                 lbf.CommandArgument = "0";
38             }
39 
40             //綁定是否編輯列
41             var lbfEdit = Grid1.FindColumn("ButtonEdit") as LinkButtonField;
42             lbfEdit.Text = "編輯";
43             //lbfEdit.Enabled = MenuInfoBll.GetInstence().CheckControlPower(this, "ButtonEdit");
44         }
45         #endregion
46 
47         #region Grid點擊事件
48         /// <summary> 
49         /// Grid點擊事件
50         /// </summary>
51         /// <param name="sender"></param>
52         /// <param name="e"></param>
53         protected void Grid1_RowCommand(object sender, FineUI.GridCommandEventArgs e)
54         {
55             GridRow gr = Grid1.Rows[e.RowIndex];
56             //獲取主鍵ID
57             object id = gr.DataKeys[0];
58 
59             switch (e.CommandName)
60             {
61                 case "IsDisplay":
62                     //更新狀態
63                     MenuInfoBll.GetInstence().UpdateIsDisplay(this, ConvertHelper.Cint0(id), ConvertHelper.Cint0(e.CommandArgument));
64                     //重新加載
65                     LoadData();
66 
67                     break;
68                 case "IsMenu":
69                     //更新狀態
70                     MenuInfoBll.GetInstence().UpdateIsMenu(this, ConvertHelper.Cint0(id), ConvertHelper.Cint0(e.CommandArgument));
71                     //重新加載
72                     LoadData();
73 
74                     break;
75                 case "ButtonEdit":
76                     Window1.IFrameUrl = "MenuInfoEdit.aspx?Id=" + id + "&" + MenuInfoBll.GetInstence().PageUrlEncryptStringNoKey(id + "");
77                     Window1.Hidden = false;
78 
79                     break;
80             }
81         }
82         #endregion
83 
84         #endregion
View Code

  而更新狀態的函數MenuInfoBll.GetInstence().UpdateIsDisplay()、MenuInfoBll.GetInstence().UpdateIsMenu(),我們模板里已經生成了,直接調用即可

 

  最后一列編輯按鍵,這個根據需要可以放到頂部的工具條里(在前面代碼大家可以看到我將其注釋了),也可以放到這里來,而放到這里的話,則需要在表格綁定的代碼中實現

  由於整個權限模塊未開發出來,所以我先將按鍵的權限判斷注釋掉了(//lbfEdit.Enabled = MenuInfoBll.GetInstence().CheckControlPower(this, "ButtonEdit");)

  在Grid點擊事件中,打開隱藏的編輯窗口

  //打開編輯窗口
      Window1.IFrameUrl = "MenuInfoEdit.aspx?Id=" + id + "&" + MenuInfoBll.GetInstence().PageUrlEncryptStringNoKey(id + "");
      Window1.Hidden = false;  //顯示窗口

   在上面的Url鏈接中,我們需要傳遞兩個參數,一個是將要編輯的記錄Id,一個是頁面加密處理參數,通過MenuInfoBll.GetInstence().PageUrlEncryptStringNoKey(id + "")函數來生成對應的頁面加密參數,系統在對密鑰進行識別處理時,會按順序默認對Id、pid、ParentId、Key這幾個值做為密鑰生成值進行識別,具體大家自行研究一下吧。

 

  而對於工具欄中的按鍵實現,添加新記錄對應的是Add()函數、編輯記錄對應的是Edit()函數、刪除記錄對應的是Delete(),當然工具欄中按鍵的命名要求必須同上面那幾個一樣,具體實現這里就不再一一細說,大家直接看代碼吧。

 

   由於時間關系,編輯頁面代碼就不進行解說,大家自己進行研究吧,下面上一張編輯頁面運行后的圖片

  

 

  另外,為了由於權限模塊未完成,所以將相關的權限判斷都注釋掉了,等后面完善后再啟用。

  本次更新,除了修改一些小問題外,也修改了CommonBll.cs類的添加用戶訪問頁面記錄函數,以及自定義類UseLogBll.cs類的添加用戶操作日志函數,讓用戶訪問頁面記錄運行起來,當然這個表記錄的不至這些訪問內容,它還會將用戶的增、刪、查、改等所有操作都記錄下來,下面看看效果圖(這個函數會將用戶登陸進系統后每一步訪問都記錄下來,這個要求是來自以前的公司老總,當時做了一個OA系統公司自己用,他看了后就說:OA開發后,如果大家都不登陸不使用那有等於沒有,能不能實現通過后端查看,知道大家有沒有使用。再然后就多了這個功能,呵呵)

  

 

 

  本章內容看起來比較亂,大家最好直接運行解決方案代碼,在瀏覽器中運行查看效果,再結合代碼查看可能會容易理解,還有一點要補充的是,本解決方案不包含extjs代碼,需要大家自行下載放到根目錄里

 

 

由於框架不是非常成熟,很多朋友不是用來學習而是直接用到項目中,但不熟悉框架引起不少小問題,所以停止提供下載,有需要學習的可以到群共享里下,不便之處敬請諒解。

 

 

 

 版權聲明:

  本文由AllEmpty原創並發布於博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com 聯系我,非常感謝。

 

  發表本編內容,只要主為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。

 

  更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM