<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="RolesEdit.aspx.cs" Inherits="PTWeb.RolesEdit" Title="项目职务" %> <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server"> <div> <%-- 多视图控件 --%> <asp:MultiView ID="MultiView1" runat="server" ActiveViewIndex="0"> <%-- 视图1 用于显示 --%> <asp:View ID="MainView" runat="server"> <%-- 视图中的内容 AutoGenerateColumns="False" 代表无需自动刷新内容 DataKeyNames="Id",代表数据主键名字,设置此值,可以获取每一行的这个值 DataSourceID="RolesDataSource" 数据源 --%> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="RolesDataSource" DataKeyNames="Id"> <Columns> <%-- ReadOnly="True" 即使在编辑状态下也不能修改 SortExpression="Name" 排序字段 --%> <asp:BoundField DataField="Id" HeaderText="编号" ReadOnly="True" SortExpression="Id" /> <asp:BoundField DataField="Name" HeaderText="职务" SortExpression="Name" /> <%-- 启用删除按钮和编辑按钮 --%> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> </Columns> </asp:GridView> <asp:LinkButton ID="AddRoleButton" runat="server" OnClick="AddRoleButton_Click">添加职务</asp:LinkButton><br /> </asp:View> <%-- 视图2 用户插入新数据 --%> <asp:View ID="InsertView" runat="server"> <%-- OnItemInserted="DetailsView1_ItemInserted" 插入新值后调用 OnModeChanged="DetailsView1_ModeChanged" 模式更改调用 AutoGenerateRows="False" 无需自动刷新 DataSourceID="RolesDataSource" 数据源 --%> <asp:DetailsView ID="DetailsView1" runat="server" AutoGenerateRows="False" DataSourceID="RolesDataSource" DefaultMode="Insert" Height="50px" Width="125px" DataKeyNames="Id" OnItemInserted="DetailsView1_ItemInserted" OnModeChanged="DetailsView1_ModeChanged"> <Fields> <asp:BoundField DataField="Id" HeaderText="编号" SortExpression="Id" /> <asp:BoundField DataField="Name" HeaderText="职务" SortExpression="Name" /> <%-- 显示插入按钮 --%> <asp:CommandField ShowInsertButton="True" /> </Fields> </asp:DetailsView> </asp:View> </asp:MultiView> <%-- 错误反馈标签,红色的 --%> <asp:Label ID="ErrorLabel" runat="server" ForeColor="Red"></asp:Label><br /> <%--自定数据源控件(539) TypeName="ProjectTracker.Library.Admin.Roles, ProjectTracker.Library" 控件关联的业务类 逗号 业务类所在的程序集 --%> <csla:CslaDataSource ID="RolesDataSource" runat="server" TypeName="ProjectTracker.Library.Admin.Roles, ProjectTracker.Library" OnDeleteObject="RolesDataSource_DeleteObject" OnInsertObject="RolesDataSource_InsertObject" OnSelectObject="RolesDataSource_SelectObject" OnUpdateObject="RolesDataSource_UpdateObject" TypeSupportsPaging="False" TypeSupportsSorting="False"> </csla:CslaDataSource> </div> </asp:Content>
//====================================================================== // // Copyright (C) All Rights Reserved // Guid1: ac0ac771-edca-45ec-a03c-8e780c6168ba // CLR版本: 2.0.50727.3053 // 新建项输入的名称: RolesEdit // 机器名称: SOFTWARE-FRT-08 // 命名空间名称: PTWeb // 文件名: RolesEdit // 当前系统时间: 2008-10-2 19:08:56 // 当前登录用户名: frt // 创建年份: 2008 // // Created by Terry.Feng.C (冯瑞涛) at 2008-10-2 19:08:56 // // //====================================================================== 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; namespace PTWeb { /// <summary> /// 这个程序中的代码都非常的简单,几乎很少超过200行,所以可以轻松的阅读 /// </summary> public partial class RolesEdit : System.Web.UI.Page { #region 私有成员 //枚举(539),直接使用数字会使代码难以维护和观看,定义枚举非常好, //比喻,可以想像如果你以后需要修改代码将MainView和InsertView这两个页面的代表调换,那么我们只需要在枚举中将0和1换个位置,尔代码无需做任何修改 private enum Views { MainView = 0, InsertView = 1 } /// <summary> /// (540) 缓存业务数据资源 /// </summary> /// <returns></returns> private ProjectTracker.Library.Admin.Roles GetRoles() { //读取指定Session内容 object businessObject = Session["currentObject"]; //判断获取内容,如果是空或者与所需的类型不符合,则重新取出数据集合 if (businessObject == null || !(businessObject is ProjectTracker.Library.Admin.Roles)) { //从数据库取出数据资源 businessObject = ProjectTracker.Library.Admin.Roles.GetRoles(); //缓存数据资源 Session["currentObject"] = businessObject; } //将数据资源返回 return (ProjectTracker.Library.Admin.Roles)businessObject; } /// <summary> /// 应用验证规则初始化页面 /// </summary> private void ApplyAuthorizationRules() { //根据当前用户CanEditObject的状态同步显示GridView的最后一列 this.GridView1.Columns[this.GridView1.Columns.Count - 1].Visible = ProjectTracker.Library.Admin.Roles.CanEditObject(); //同上面的道理一样,因为此系统没有真正意义上的权限系统所以这些权限的最终判断是写死的,在这里他们是Administrator this.AddRoleButton.Visible = ProjectTracker.Library.Admin.Roles.CanAddObject(); } #endregion #region 窗体事件 /// <summary> /// Load事件的使用多在对程序页面的初始设置上,其中的代码基本上全是围绕初始化展开的 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { //如果不是回调,一般只第一次进入 if (!IsPostBack) { //清空内容对象(540) Session["currentObject"] = null; //这个方法的调用是初始化根据权限去初始化页面(547) ApplyAuthorizationRules(); } else this.ErrorLabel.Text = ""; } /// <summary> /// (542)加职务按钮 /// </summary> /// <param name="sender">被监控的对象</param> /// <param name="e">事件处理中所感兴趣的东西</param> protected void AddRoleButton_Click(object sender, EventArgs e) { //设置模式为插入模式 this.DetailsView1.DefaultMode = DetailsViewMode.Insert; //激活显示DetailsView的那个View,当然只显示这个视图,刚才的那个视图被隐藏 MultiView1.ActiveViewIndex = (int)Views.InsertView; } /// <summary> /// 当插入后激发 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void DetailsView1_ItemInserted( object sender, DetailsViewInsertedEventArgs e) { //点击插入后,View模式还原 MultiView1.ActiveViewIndex = (int)Views.MainView; //(545)表格重新绑定以刷新表格内容,DataBind的调用会使GridView刷新内容,之后导致RolesDataSource的SelectObject被触发 this.GridView1.DataBind(); } /// <summary> /// 在插入或者是更新等操作的时候,都有可能会点击取消操作,取消会导致模式的改变,由此引发此事件去改变显示模式,回复列表显示 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void DetailsView1_ModeChanged( object sender, EventArgs e) { //模式一点更改,索命已经点击了插入按钮,将View视图还原 MultiView1.ActiveViewIndex = (int)Views.MainView; } #endregion #region 数据控制 /// <summary> /// 删除,同理点击删除按钮激发这个事件(547) /// </summary> /// <param name="sender">一般这个对象指被监视对象,是事件的发送者,一直被监视的目标。这个对象包含着其他对象所感兴趣的内容,当这个感兴趣的内容到达某种状态就会发送消息,这个消息就是事件, /// 比如被点击了,或者修改了,去提示监控者去调用某些处理程序,这个程序就是下面的方法。</param> /// <param name="e">这个对象包含这监控者所感兴趣的数据,这个会根据不同的事件尔改变(因为不同的事件都是具有不同的委托签名的),在这里指的是删除的是那条记录啊</param> protected void RolesDataSource_DeleteObject(object sender, Csla.Web.DeleteObjectArgs e) { try { ProjectTracker.Library.Admin.Roles obj = GetRoles(); //获取被删除记录的那条记录的键值, int id = (int)e.Keys["Id"]; //调用业务类方法设置为删除标记 obj.Remove(id); //调用Save真正删除 Session["currentObject"] = obj.Save(); e.RowsAffected = 1; } catch (Csla.DataPortalException ex) { this.ErrorLabel.Text = ex.BusinessException.Message; e.RowsAffected = 0; } catch (Exception ex) { this.ErrorLabel.Text = ex.Message; e.RowsAffected = 0; } } /// <summary> /// (543)当用户通过DetailsView输入新的Role,在控件上点击插入连接,RolesDataSource会触发这个事件,将新角色添加到集合当中 /// /// </summary> ///<param name="sender">一般这个对象指被监视对象,是事件的发送者,一直被监视的目标。这个对象包含着其他对象所感兴趣的内容,当这个感兴趣的内容到达某种状态就会发送消息,这个消息就是事件, /// 比如被点击了,或者修改了,去提示监控者去调用某些处理程序,这个程序就是下面的方法。</param> /// <param name="e">这个对象包含这监控者所感兴趣的数据,这个会根据不同的事件尔改变(因为不同的事件都是具有不同的委托签名的),在这里指的是插入的是那条记录啊</param> protected void RolesDataSource_InsertObject( object sender, Csla.Web.InsertObjectArgs e) { try { //(544)获取列表对象 ProjectTracker.Library.Admin.Roles obj = GetRoles(); //调用AddNew方法,最终他会调用我们重载的AddNewCore方法,请看Roes.cs,新建一个 ProjectTracker.Library.Admin.Role role = obj.AddNew(); //(544)拷贝Values中的属性值,到Role这个对象中,当然你也可以使用,原始的Role.Name=e.Values["Name"].ToString;是一样的 Csla.Data.DataMapper.Map(e.Values, role); //调用Save保存,并将被更新的结果集返回,当然你也可以,将这个操作留给一个按钮事件 //当时请注意这个将新的结果集付给Session的动作是非常有学问的,她会在之后的显示刷新时候直接被用到,如果不付给这个缓存,那么新的结果将无法及时反映 Session["currentObject"] = obj.Save(); //受到影响 e.RowsAffected = 1; } catch (Csla.DataPortalException ex) { this.ErrorLabel.Text = ex.BusinessException.Message; e.RowsAffected = 0; } catch (Exception ex) { this.ErrorLabel.Text = ex.Message; e.RowsAffected = 0; } } /// <summary> /// 选择 /// </summary> /// <param name="sender">一般这个对象指被监视对象,是事件的发送者,一直被监视的目标。这个对象包含着其他对象所感兴趣的内容,当这个感兴趣的内容到达某种状态就会发送消息,这个消息就是事件, /// 比如被点击了,或者修改了,去提示监控者去调用某些处理程序,这个程序就是下面的方法。</param> /// <param name="e">这个对象包含这监控者所感兴趣的数据,这个会根据不同的事件尔改变(因为不同的事件都是具有不同的委托签名的),在这里指的是选择的是那条记录啊</param> protected void RolesDataSource_SelectObject( object sender, Csla.Web.SelectObjectArgs e) { //获取数据资源 ProjectTracker.Library.Admin.Roles obj = GetRoles(); //将资源,绑定 e.BusinessObject = obj; } /// <summary> /// 更新,点击绑定的控件的更新按钮会激发数据源此事件, /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void RolesDataSource_UpdateObject( object sender, Csla.Web.UpdateObjectArgs e) { ProjectTracker.Library.Admin.Roles obj = GetRoles(); try { //转换字符串到整型,作为参数,调用业务方法获取一个职务对象引用 //e.Keys可以获得当前控件的中DataKeyNames域中的值 ProjectTracker.Library.Admin.Role role = obj.GetRoleById(int.Parse(e.Keys["Id"].ToString())); //将更改对象中名字字段的值付给Name属性,这里没有使用上面的Map功能,因为只有一列 role.Name = e.Values["Name"].ToString(); //调用保存方法 Session["currentObject"] = obj.Save(); //受影响 e.RowsAffected = 1; } catch (Csla.DataPortalException ex) { this.ErrorLabel.Text = ex.BusinessException.Message; e.RowsAffected = 0; } catch (Exception ex) { this.ErrorLabel.Text = ex.Message; e.RowsAffected = 0; } } #endregion } }
冯瑞涛