首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

13.8  通讯录

本节主要介绍基于ASP.NET Ajax技术的邮件系统中与通讯录相关的操作和管理,如添加组、编辑组的属性、组管理、添加组内联系人、移动联系人等。

13.8.1  操作通讯录的数据访问层设计

操作通讯录的数据访问层由类Group和Linkman实现。它们定义了添加、修改、检索、删除通讯录中的信息(如组和联系人)的方法,具体如下。

*     public DataSet GetGroupsDS(),获取所有组,并使用DataSet对象保存结果。

*     public SqlDataReader GetGroups(),获取所有组,并使用SqlDataReader读取结果。

*     public SqlDataReader GetSingleGroup(int groupID),获取单个组。

*     public int AddGroup(string name),创建新的组。

*     public int UpdateGroup(int groupID,string name),修改组。

*     public int DeleteGroup(int groupID),删除组。

*     public DataSet GetLinkmanDSByGroup(int groupID),根据指定的组获取其所有联系人,并使用DataSet对象保存结果。

*     public SqlDataReader GetLinkmanByGroup(int groupID),根据指定的组获取其所有联系人,并使用SqlDataReader读取结果。

*     public SqlDataReader GetSingleLinkman(int linkmanID),获取单个联系人。

*     public int AddLinkman(string name,string email,int groupID),添加新的联系人。

*     public int UpdateLinkman(int linkmanID,string name,string email),修改联系人。

*     public int MoveLinkman(int linkmanID,int groupID),移动联系人,即将联系人从一个组移动到另外一个组。

*     public int DeleteLinkman(int linkmanID),删除联系人。

类Group和Linkman被包含在命名空间Web2ASPNET2.ASPNET2AjaxMail中,它们的程序代码如下:

namespace Web2ASPNET2.ASPNET2AjaxMail{

public class Group{

public Group(){}

public DataSet GetGroupsDS()

{   ///执行存储过程

    return DataCommon.GetDataByDataSet("Pr_GetAjaxGroups");

}

public SqlDataReader GetGroups()

{   ///执行存储过程

    return DataCommon.GetDataByReader("Pr_GetAjaxGroups");

}

public SqlDataReader GetSingleGroup(int groupID)

{   ///执行存储过程

    return DataCommon.GetDataByReaderIDParam(

        "Pr_GetSingleAjaxGroup",groupID);

}

public int AddGroup(string name)

{   ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@Name",SqlDbType.VarChar,50,name)

    };

    ///执行存储过程

    return (OperateDatabase.RunProc("Pr_AddAjaxGroup",parameters));

}

public int UpdateGroup(int groupID,string name)

    {   ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@ID",SqlDbType.Int,4,groupID),

        OperateDatabase.CreateInParam("@Name",SqlDbType.VarChar,50,name)

    };

    ///执行存储过程

    return (OperateDatabase.RunProc("Pr_UpdateAjaxGroup",parameters));

}

public int DeleteGroup(int groupID)

{   ///执行存储过程

    return DataCommon.QueryDataIDParam("Pr_DeleteAjaxGroup",groupID);

}}

public class Linkman{

public Linkman(){}

public DataSet GetLinkmanDSByGroup(int groupID)

{   ///定义保存数据的DataSet对象

    DataSet ds = new DataSet();

    ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@GroupID",SqlDbType.Int,4,groupID)

    };

    ///执行存储过程

    OperateDatabase.RunProc("Pr_GetAjaxLinkmanByGroup",

        ref ds,parameters);

    return ds;///返回结果

}

public SqlDataReader GetLinkmanByGroup(int groupID)

{   ///定义保存数据的DataSet对象

    DataSet ds = new DataSet();

    ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@GroupID",SqlDbType.Int,4,groupID)

    };

    ///执行存储过程

    OperateDatabase.RunProc("Pr_GetAjaxLinkmanByGroup",

        out dr,parameters);

    return dr;///返回结果

}

public DataSet GetLinkmanByKey(string key)

{   ///定义保存数据的DataSet对象

    DataSet ds = new DataSet();

    ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@Key",SqlDbType.VarChar,255,key)

    };

    ///执行存储过程

    OperateDatabase.RunProc("Pr_GetAjaxLinkmanByKey",ref ds,parameters);

    return ds;///返回结果

}

public SqlDataReader GetSingleLinkman(int linkmanID)

{   ///执行存储过程

    return DataCommon.GetDataByReaderIDParam("Pr_GetSingleAjaxLinkman",

        linkmanID);

}

public int AddLinkman(string name,string email,int groupID)

{   ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@Name",SqlDbType.VarChar,50,name),

        OperateDatabase.CreateInParam("@Email",SqlDbType.VarChar,255,

            email),

        OperateDatabase.CreateInParam("@GroupID",SqlDbType.Int,4,groupID)

    };

    ///执行存储过程

    return (OperateDatabase.RunProc("Pr_AddAjaxLinkman",parameters));

}

public int UpdateLinkman(int linkmanID,string name,string email)

{   ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@ID",SqlDbType.Int,4,linkmanID),

        OperateDatabase.CreateInParam("@Name",SqlDbType.VarChar,50,name),

        OperateDatabase.CreateInParam("@Email",SqlDbType.VarChar,255,

            email)

    };

    ///执行存储过程

    return (OperateDatabase.RunProc("Pr_UpdateAjaxLinkman",parameters));

}

public int MoveLinkman(int linkmanID,int groupID)

{   ///添加存储过程参数

    SqlParameter[] parameters = {

        OperateDatabase.CreateInParam("@ID",SqlDbType.Int,4,linkmanID),

        OperateDatabase.CreateInParam("@GroupID",SqlDbType.Int,4,groupID)

    };

    ///执行存储过程

    return (OperateDatabase.RunProc("Pr_MoveAjaxLinkman",parameters));

}

public int DeleteLinkman(int linkmanID)

{   ///执行存储过程

    return DataCommon.QueryDataIDParam("Pr_DeleteAjaxLinkman",linkmanID);

}}}

13.8.2  添加组

添加组由页面AddGroup.aspx实现,它的代码隐藏文件为AddGroup.aspx.cs。该页面实现功能如下所示。

*     输入新组的名称。

*     添加新组,并把新组的信息提交到数据库中。

*     返回到组管理页面GroupManage.aspx。

用户可以在页面AddGroup.aspx上设置新组的名称。该页面的最终效果如图13.41所示。

图13.41  添加组页面AddGroup.aspx

1.界面设计

页面AddGroup.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AddGroup.aspx.cs"

    Inherits="Portal_AddGroup" StylesheetTheme="Web2ASPNET2" %>   

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server" Title="添加新组" />

页面AddGroup.aspx添加了一个TextBox控件、三个Button控件和一个非空验证控件,它们的ID属性的值分别为tbName、btnAdd、btnReturn、btnAddAndReturn和rfName。

tbName控件用来输入组的名称;btnAdd控件添加新组到数据库中,并准备再次添加;btnAddAndReturn控件添加新组到数据库中,并重定向到管理页面GroupManage.aspx。btnReturn控件重定向到管理页面GroupManage.aspx;rfName控件对用户输入的组名称进行非空验证。页面AddGroup.aspx的设计界面如图13.42所示。

图13.42  页面AddGroup.aspx的设计界面

页面AddGroup.aspx的HTML部分设计代码如下:

组名称:<asp:TextBox ID="tbName" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="50" Width="300px"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfName" runat="server"

    ControlToValidate="tbName" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

<asp:Button ID="btnAdd" runat="server" Text="保存,并再添加"

    CssClass="Button" OnClick="btnAdd_Click" SkinID="btnSkin" />

<asp:Button ID="btnAddAndReturn" runat="server" CssClass="Button"

    Text="保存,并返回管理页面" OnClick="btnAddAndReturn_Click"

    SkinID="btnSkin" />&nbsp;&nbsp;&nbsp;

<asp:Button ID="btnReturn" runat="server" CssClass="Button"

    Text="返回管理页面" CausesValidation="False" OnClick="btnReturn_Click"

    SkinID="btnSkin" />

2.页面初始化

页面AddGroup.aspx首先引入了3个命名空间,它们分别为CommonOperation、ASPNET2AjaxMail和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using Web2ASPNET2.ASPNET2AjaxMail;

页面AddGroup.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据,它判断判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。它的程序代码如下:

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

    {   ///返回上一个页面

        Response.Write("<script>history.back()</script>");

        Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

        return;

    }

}

3.添加新组

用户单击页面AddGroup.aspx上的【保存,并再添加】、【保存,并返回管理页面】按钮,都实现添加新组到数据库中的功能。其中,第一个按钮添加新组到数据库中,并准备再次添加,该按钮触发事件btnAdd_Click(object sender, EventArgs e)。第二个按钮添加新组到数据库中之后,重定向到管理页面GroupManage.aspx,该按钮触发事件btnAddAndReturn_Click(object sender, EventArgs e)。

上述两个事件都调用Group类的方法AddGroup(string name)添加新组到数据库中。若添加操作成功,则弹出“恭喜您,添加新组成功……”的对话框。上述两个事件的程序代码如下:

protected void btnAdd_Click(object sender,EventArgs e)

{   ///执行添加操作

    Group group = new Group();

    if(group.AddGroup(tbName.Text) > 0)

    {

        Dialog.OpenDialogInAjax((Button)sender,"恭喜您,添加新组成功……");

    }

}

protected void btnAddAndReturn_Click(object sender,EventArgs e)

{   ///执行添加操作

    Group group = new Group();

    if(group.AddGroup(tbName.Text) > 0)

    {

        Dialog.OpenDialogInAjax((Button)sender,"恭喜您,添加新组成功……");

        Response.Redirect("~/Portal/GroupManage.aspx");  ///返回管理页面

    }

}

4.返回功能

用户单击页面AddGroup.aspx上的【返回管理页面】按钮,可以重定向到组管理页面GroupManage.aspx。该按钮触发事件btnReturn_Click(object sender,EventArgs e),它的程序代码如下:

protected void btnReturn_Click(object sender,EventArgs e)

{

    Response.Redirect("~/Portal/GroupManage.aspx");    ///返回管理页面

}

13.8.3  编辑组的属性

编辑组的属性由页面UpdateGroup.aspx实现,它的代码隐藏文件为UpdateGroup.aspx.cs。该页面实现功能如下所示。

*     编辑组的名称。

*     修改组,并把修改后的组的信息提交到数据库中。

*     返回到组管理页面GroupManage.aspx。

用户可以在页面UpdateGroup.aspx上修改组的名称。该页面的最终效果如图13.43所示。

图13.43  编辑组的属性页面AddDirectory.aspx

1.界面设计

页面UpdateGroup.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true"

    CodeFile="UpdateGroup.aspx.cs" Inherits="Portal_UpdateGroup"

    StylesheetTheme="Web2ASPNET2" %>

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server"Title="编辑组的属性"/>

页面UpdateGroup.aspx添加了一个TextBox控件、两个Button控件和一个非空验证控件,它们的ID属性的值分别为tbName、btnReturn、btnUpdateAndReturn和rfName。

tbName控件用来编辑组的名称;btnUpdateAndReturn控件修改组的名称之后重定向到管理页面GroupManage.aspx;btnReturn控件重定向到管理页面GroupManage.aspx。

rfName控件对用户输入的组名称进行非空验证。页面UpdateGroup.aspx的设计界面如图13.44所示。

图13.44  页面UpdateGroup.aspx的设计界面

页面UpdateGroup.aspx的HTML部分设计代码如下:

组名称:<asp:TextBox ID="tbName" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="50" Width="300px"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfName" runat="server"

    ControlToValidate="tbName" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

<asp:Button ID="btnUpdateAndReturn" runat="server" CssClass="Button"

    Text="保存,并返回管理页面" Enabled="False"

    OnClick="btnUpdateAndReturn_Click" SkinID="btnSkin" />

<asp:Button ID="btnReturn" runat="server" CssClass="Button"

    Text="返回管理页面" CausesValidation="False" OnClick="btnReturn_Click"

    SkinID="btnSkin" />

2.页面初始化

页面UpdateGroup.aspx首先引入了4个命名空间,它们分别为CommonOperation、SqlClient、ASPNET2AjaxMail和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using System.Data.SqlClient;

using Web2ASPNET2.ASPNET2AjaxMail;

页面UpdateGroup.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据。它实现以下4个功能。

*     判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。

*     获取被编辑组的ID值,并保存在变量groupID中。

*     调用函数BindPageData(int groupID),显示被编辑组的名称。

*     根据变量groupID的值判断btnUpdateAndReturn按钮是否可用。如果该变量的值大于0,则这两个按钮可用;否则,不可用。

事件Page_Load(object sender,EventArgs e)和函数BindPageData(int groupID)的程序代码如下:

int groupID = -1;

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

    {   ///返回上一个页面

        Response.Write("<script>history.back()</script>");

        Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

        return;

    }

    ///获取被修改信息的ID

    if(Request.Params["GroupID"] != null)

    {

        groupID = DataTypeConvert.ConvertToInt(

            Request.Params["GroupID"].ToString());

    }

    ///显示被修改的数据

    if(!Page.IsPostBack){if(groupID > -1){BindPageData(groupID);}}

    ///设置按钮的可用性

    int[] idList = { groupID };

    ButtonEnable.ControlButtonEnable(btnUpdateAndReturn,idList);

}

private void BindPageData(int groupID)

{   ///获取单个记录信息

    Group group = new Group();

    SqlDataReader dr = group.GetSingleGroup(groupID);

    if(dr == null) return;

    if(dr.Read()){tbName.Text = dr["Name"].ToString();}   ///显示信息

    dr.Close();

}

3.修改组

用户单击页面UpdateGroup.aspx上的【保存,并返回管理页面】按钮实现修改组的功能。该按钮首先将修改后的组信息提交到数据库,然后重定向到管理页面GroupManage.aspx。该按钮触发事件btnUpdateAndReturn_Click(object sender, EventArgs e)。

上述事件调用Group类的方法UpdateGroup(int groupID,string name)将组修改后的信息提交到数据库。若操作成功,则弹出“恭喜您,修改组信息成功……”的对话框。上述事件的程序代码如下:

protected void btnUpdateAndReturn_Click(object sender,EventArgs e)

{   ///执行修改操作

    Group group = new Group();

    if(group.UpdateGroup(groupID,tbName.Text) > 0)

    {

        Dialog.OpenDialogInAjax((Button)sender,"恭喜您,修改组信息成功……");

        Response.Redirect("~/Portal/GroupManage.aspx"); ///返回管理页面

    }

}

4.返回功能

用户单击页面UpdateGroup.aspx上的【返回管理页面】按钮,可以重定向到组管理页面GroupManage.aspx。该按钮触发事件btnReturn_Click(object sender,EventArgs e),它的程序代码如下:

protected void btnReturn_Click(object sender,EventArgs e)

{

    Response.Redirect("~/Portal/GroupManage.aspx");   ///返回管理页面

}

13.8.4  组管理

组管理由页面GroupManage.aspx实现,它的代码隐藏文件为GroupManage.aspx.cs。该页面实现下面4个功能。

*     以列表形式显示组的信息。

*     显示每一个组包含成员的数量。

*     提供重定向到管理组的联系人页面、修改组页面的按钮。

*     提供删除组的功能。

页面GroupManage.aspx以列表形式显示组的信息,如组的名称。该页面的最终效果如图13.45所示。

图13.45  组管理页面GroupManage.aspx

1.界面设计

页面GroupManage.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true"

    CodeFile="GroupManage.aspx.cs" Inherits="Portal_GroupManage"

    StylesheetTheme="Web2ASPNET2" %>

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server" Title="组管理" />

页面GroupManage.aspx添加了一个GridView控件和一个Button控件,它们的ID属性的值分别为gvGroup和btnAdd。gvGroup控件以列表形式显示组的信息,如组的名称;btnAdd控件重定向到添加新组的页面AddGroup.aspx。页面GroupManage.aspx的设计界面如图13.46所示。

图13.46  页面GroupManage.aspx的设计界面

页面GroupManage.aspx的HTML部分设计代码如下:

<asp:GridView ID="gvGroup" runat="server" AutoGenerateColumns="False"

    Font-Names="Tahoma" Width="100%" SkinID="gvSkin" DataKeyNames="ID"

    OnRowCommand="gvGroup_RowCommand"

    OnRowDataBound="gvGroup_RowDataBound">

    <EmptyDataTemplate>组列表为空,您可用添加新的组。</EmptyDataTemplate>

    <Columns>

        <asp:TemplateField HeaderText="组名称"><ItemTemplate>

            <%# Eval("Name")%>(<%# Eval("LinkmanCount")%>)

        </ItemTemplate></asp:TemplateField>

        <asp:TemplateField HeaderText="操作"><ItemTemplate>

            <asp:ImageButton ID="ibtLinkman" runat="server"

            CommandName="linkman"

            ImageUrl="../App_Themes/Web2ASPNET2/Images/add.gif"

            AlternateText="管理该组的联系人"

            CommandArgument='<%# Eval("ID") %>' />&nbsp;&nbsp;

            <asp:ImageButton ID="ibtUpdate" runat="server"

            CommandName="update"

            ImageUrl="../App_Themes/Web2ASPNET2/Images/update.gif"

            AlternateText="编辑该组" CommandArgument='<%# Eval("ID") %>' />

            <asp:ImageButton ID="ibtDelete" runat="server"

            CommandName="del"

            ImageUrl="../App_Themes/Web2ASPNET2/Images/delete.gif"

            AlternateText="删除该组" CommandArgument='<%# Eval("ID") %>' />

        </ItemTemplate></asp:TemplateField>

    </Columns>

</asp:GridView>

<asp:Button ID="btnAdd" runat="server" Text="添加新组" CssClass="Button"

    OnClick="btnAdd_Click" SkinID="btnSkin" Width="150px" />

2.页面初始化

页面GroupManage.aspx首先引入了3个命名空间,它们分别为CommonOperation、ASPNET2AjaxMail和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using Web2ASPNET2.ASPNET2AjaxMail;

页面GroupManage.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据。其实现功能如下所示。

*     判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。

*     调用函数BindPageData()以列表形式显示组的信息,这些信息显示在gvGroup控件中。

事件Page_Load(object sender,EventArgs e)和函数BindPageData()的程序代码如下:

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

{   ///返回上一个页面

    Response.Write("<script>history.back()</script>");

    Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

    return;

}

if(!Page.IsPostBack){BindPageData();}    ///绑定控件的数据

}

private void BindPageData()

{   ///绑定控件的数据

    Group group = new Group();

    Web2ASPNET2.CommonOperation.DataBinder.BindGridViewData(

    gvGroup,group.GetGroups());

}

3.重定向和删除功能

页面GroupManage.aspx为gvGroup控件定义了RowCommand和RowDataBound事件,它们的名称分别为gvGroup_RowCommand(object sender, GridViewCommandEventArgs e)和gvGroup_RowDataBound(object sender, GridViewRowEventArgs e)。

当用户单击gvGroup控件中的【】、【】或【×】按钮时,将触发第一个事件,该事件根据按钮的CommandName属性的值执行不同的操作。如果该属性的值为“update”,则重定向到修改组的页面UpdateGroup.aspx;如果该属性的值为“linkman”,则重定向到管理组内联系人的页面GroupLinkmanManage.aspx;如果该属性的值为“del”,则删除当前行的组。

第二个事件在行数据绑定之后触发。它为每一行的【×】按钮添加删除确认对话框。当用户单击【×】按钮时,页面首先弹出该对话框。上述两个事件的程序代码如下:

protected void gvGroup_RowCommand(object sender,

    GridViewCommandEventArgs e)

{   ///重定向到编辑页面

    if(e.CommandName == "update")

    {

        Response.Redirect("~/Portal/UpdateGroup.aspx?GroupID="

        + e.CommandArgument.ToString());

    }

    ///重定向到管理组内联系人的页面

    if(e.CommandName == "linkman")

    {

        Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

            + e.CommandArgument.ToString());

    }

    if(e.CommandName == "del")

    {   ///执行删除操作

        Group group = new Group();

        group.DeleteGroup(DataTypeConvert.ConvertToInt(

            e.CommandArgument.ToString()));

        BindPageData();///重新绑定控件数据

    }

}

protected void gvGroup_RowDataBound(object sender,GridViewRowEventArgs e)

{   ///为删除按钮添加确认对话框

    ImageButton ibtDelete = (ImageButton)e.Row.FindControl("ibtDelete");

    if(ibtDelete != null)

    {

        ibtDelete.Attributes.Add("onclick",

            "return confirm('你确定要删除所选择的数据行吗?');");

    }

}

4.重定向添加新组的页面AddGroup.aspx

用户单击页面GroupManage.aspx上的【添加新的组】按钮,可以重定向到添加新组的页面AddGroup.aspx。该按钮触发事件btnAdd_Click(object sender,EventArgs e),它的程序代码如下:

protected void btnAdd_Click(object sender,EventArgs e)

{

    Response.Redirect("~/Portal/AddGroup.aspx");    ///页面重定向

}

13.8.5  添加联系人

添加联系人由页面AddLinkman.aspx实现,它的代码隐藏文件为AddLinkman.aspx.cs。该页面实现功能如下所示。

*     输入新联系人的名称和电子邮件。

*     选择新联系人所属的组。

*     添加新联系人能,并把新联系人的信息提交到数据库中。

*     返回联系人管理页面GroupLinkmanManage.aspx。

用户可以在页面AddLinkman.aspx上设置新联系人的名称、电子邮件以及所属的组。该页面的最终效果如图13.47所示。

图13.47  添加联系人页面AddLinkman.aspx

1.界面设计

页面AddLinkman.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true"

    CodeFile="AddLinkman.aspx.cs" Inherits="Portal_AddLinkman"

    StylesheetTheme="Web2ASPNET2" %>

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server"Title="添加新联系人"/>

页面AddLinkman.aspx添加了两个TextBox控件、三个Button控件、两个非空验证控件、一个正则表达式验证控件和一个下拉列表控件,它们的ID属性的值分别为tbName、tbEmail、btnAdd、btnReturn、btnAddAndReturn、rfName、rfEmail、reEmail和ddlGroup。

tbName、tbEmail控件分别用来输入联系人的名称和电子邮件;ddlGroup控件显示供选择的组;btnAdd控件添加新联系人,并准备再次添加;btnAddAndReturn控件添加新联系人,并重定向到联系人管理页面GroupLinkmanManage.aspx;btnReturn控件重定向到联系人管理页面GroupLinkmanManage.aspx。

rfName、rfEmail控件分别对用户输入联系人的名称和电子邮件进行非空验证;reEmail控件验证用户输入的电子邮件的格式是否正确。页面AddLinkman.aspx的设计界面如图13.48所示。

图13.48  页面AddLinkman.aspx的设计界面

页面AddLinkman.aspx的HTML部分设计代码如下:

名称:<asp:TextBox ID="tbName" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="50" Width="300px"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfName" runat="server"

    ControlToValidate="tbName" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

电子邮件:<asp:TextBox ID="tbEmail" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="255" Width="300px"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfEmail" runat="server"

    ControlToValidate="tbEmail" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

<asp:RegularExpressionValidator ID="reEmail" runat="server"

    ControlToValidate="tbEmail" ErrorMessage="电子邮件格式不正确。"

    ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"

    Display="Dynamic"></asp:RegularExpressionValidator>

所属组:<asp:DropDownList ID="ddlGroup" runat="server" SkinID="ddlSkin"

    Width="300px"></asp:DropDownList>

<asp:Button ID="btnAdd" runat="server" Text="保存,并再添加"

    CssClass="Button" OnClick="btnAdd_Click" SkinID="btnSkin" />

<asp:Button ID="btnAddAndReturn" runat="server" CssClass="Button"

    Text="保存,并返回管理页面" OnClick="btnAddAndReturn_Click"

    SkinID="btnSkin" />

<asp:Button ID="btnReturn" runat="server" CssClass="Button"

    Text="返回管理页面" CausesValidation="False" OnClick="btnReturn_Click"

    SkinID="btnSkin" />

2.页面初始化

页面AddLinkman.aspx首先引入了4个命名空间,它们分别为CommonOperation、SqlClient、ASPNET2AjaxMail和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using System.Data.SqlClient;

using Web2ASPNET2.ASPNET2AjaxMail;

页面AddLinkman.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据。其实现功能如下所示。

*     判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。

*     调用函数BindPageData()显示系统中的可供选择的组。组信息显示在ddlGroup控件中。

*     根据ddlGroup控件判断btnAdd和btnAddAndReturn按钮是否可用。如果该控件存在选择项,则这两个按钮可用;否则,不可用。

事件Page_Load(object sender,EventArgs e)和函数BindPageData()的程序代码如下:

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

    {   ///返回上一个页面

        Response.Write("<script>history.back()</script>");

        Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

        return;

    }

    if(!Page.IsPostBack){BindPageData();}

    ///设置按钮的可用性

    ListControl[] list = {ddlGroup};

    ButtonEnable.ControlButtonEnable(btnAdd,list);

    ButtonEnable.ControlButtonEnable(btnAddAndReturn,list);

}

private void BindPageData()

{   ///显示组信息

    Group group = new Group();

    Web2ASPNET2.CommonOperation.DataBinder.BindListData(

        ddlGroup,group.GetGroups(),"Name","ID");

}

3.添加新联系人

用户单击页面AddLinkman.aspx上的【保存,并再添加】、【保存,并返回管理页面】按钮实现添加新联系人到数据库中的功能。其中,第一个按钮添加新联系人之后,并准备再次添加,该按钮触发事件btnAdd_Click(object sender, EventArgs e)。第二个按钮添加新联系人之后,并重定向到联系人管理页面GroupLinkmanManage.aspx,该按钮触发事件btnAddAndReturn_Click(object sender, EventArgs e)。

上述两个事件都调用Linkman类的方法AddLinkman(string name,string email,int groupID),添加新联系人到数据库中。若添加操作成功,则弹出“恭喜您,添加新联系人成功……”的对话框。上述两个事件的程序代码如下:

protected void btnAdd_Click(object sender,EventArgs e)

{   ///执行添加操作

    Linkman linkman = new Linkman();

    if(linkman.AddLinkman(tbName.Text,tbEmail.Text,

        DataTypeConvert.ConvertToInt(ddlGroup.SelectedValue)) > 0)

    {

        Dialog.OpenDialogInAjax((Button)sender,"恭喜您,添加新联系人成功……");

    }

}

protected void btnAddAndReturn_Click(object sender,EventArgs e)

{  ///执行添加操作

    Linkman linkman = new Linkman();

    if(linkman.AddLinkman(tbName.Text,tbEmail.Text,

        DataTypeConvert.ConvertToInt(ddlGroup.SelectedValue)) > 0)

    {

        Dialog.OpenDialogInAjax((Button)sender,"恭喜您,添加新联系人成功……");

        ///返回管理页面

        if(ddlGroup.SelectedItem != null)

        {

            Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

                + ddlGroup.SelectedValue);

        }

    }

}

4.返回功能

用户单击页面AddLinkman.aspx上的【返回管理页面】按钮,可以重定向到联系人管理页面GroupLinkmanManage.aspx。如果ddlGroup控件选择了一个组,则该页面将显示该组的联系人。该按钮触发事件btnReturn_Click(object sender,EventArgs e),它的程序代码如下:

protected void btnReturn_Click(object sender,EventArgs e)

{   ///返回管理页面

    if(ddlGroup.SelectedItem != null)

    {

        Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

            + ddlGroup.SelectedValue);

    }

    else{Response.Redirect("~/Portal/GroupLinkmanManage.aspx");}

}

13.8.6  编辑联系人的属性

编辑联系人的属性由页面UpdateLinkman.aspx实现,它的代码隐藏文件为UpdateLinkman.aspx.cs。该页面实现功能如下所示。

*     编辑联系人的名称和电子邮件。

*     修改联系人,并把修改后的联系人信息提交到数据库中。

*     返回到联系人管理页面GroupLinkmanManage.aspx。

用户可以在页面UpdateLinkman.aspx上编辑联系人的名称和电子邮件。该页面的最终效果如图13.49所示。

图13.49  编辑联系人的属性页面UpdateLinkman.aspx

1.界面设计

页面UpdateLinkman.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true"

    CodeFile="UpdateLinkman.aspx.cs" Inherits="Portal_UpdateLinkman"

    StylesheetTheme="Web2ASPNET2" %>

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server"

    Title="编辑联系人的属性" />

页面UpdateLinkman.aspx添加了两个TextBox控件、两个Button控件、两个非空验证控件、一个正则表达式验证控件和一个下拉列表控件,它们的ID属性的值分别为tbName、tbEmail、btnReturn、btnUpdateAndReturn、rfName、rfEmail、reEmail和ddlGroup。

tbName、tbEmail控件分别用来编辑联系人的名称和电子邮件;btnUpdateAndReturn控件编辑联系人,并重定向到联系人管理页面GroupLinkmanManage.aspx;btnReturn控件重定向到联系人管理页面GroupLinkmanManage.aspx。

rfName、rfEmail控件分别对用户输入联系人的名称和电子邮件进行非空验证;reEmail控件验证用户输入的电子邮件的格式是否正确。页面UpdateLinkman.aspx的设计界面如图13.50所示。

图13.50  页面UpdateLinkman.aspx的设计界面

页面UpdateLinkman.aspx的HTML部分设计代码如下:

名称:<asp:TextBox ID="tbName" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="50" Width="300px"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfName" runat="server"

    ControlToValidate="tbName" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

电子邮件:<asp:TextBox ID="tbEmail" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="255" Width="300px"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfEmail" runat="server"

    ControlToValidate="tbEmail" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

<asp:RegularExpressionValidator ID="reEmail" runat="server"

    ControlToValidate="tbEmail" ErrorMessage="电子邮件格式不正确。"

    ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"

    Display="Dynamic"></asp:RegularExpressionValidator>

所属组:<asp:DropDownList ID="ddlGroup" runat="server" SkinID="ddlSkin"

    Width="300px" Enabled="False"></asp:DropDownList>

<asp:Button ID="btnUpdateAndReturn" runat="server" CssClass="Button"

    Text="保存,并返回管理页面" Enabled="False"

    OnClick="btnUpdateAndReturn_Click" SkinID="btnSkin" />

<asp:Button ID="btnReturn" runat="server" CssClass="Button"

    Text="返回管理页面" CausesValidation="False" OnClick="btnReturn_Click"

    SkinID="btnSkin" />

2.页面初始化

页面UpdateLinkman.aspx首先引入了4个命名空间,它们分别为CommonOperation、SqlClient、ASPNET2AjaxMail和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using System.Data.SqlClient;

using Web2ASPNET2.ASPNET2AjaxMail;

页面UpdateLinkman.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据,它实现以下4个功能。

*     判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。

*     获取被修改联系人的ID值,并保存在变量linkmanID中。

*     调用函数BindPageData(int groupID)显示被修改联系人的信息,如名称和电子邮件。

*     根据ddlGroup控件和变量linkmanID的值来判断btnAdd和btnUpdateAndReturn按钮是否可用。如果ddlGroup控件不存在选择项,或者变量linkmanID的值小于0,则这两个按钮不可用;否则,可用。

事件Page_Load(object sender,EventArgs e)和函数BindPageData(int groupID)的程序代码如下:

int linkmanID = -1;

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

    {   ///返回上一个页面

        Response.Write("<script>history.back()</script>");

        Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

        return;

    }

    if(Request.Params["LinkmanID"] != null)

    {   ///获取被修改信息的ID

        linkmanID = DataTypeConvert.ConvertToInt(

            Request.Params["LinkmanID"].ToString());

    }

    ///显示被修改的数据

    if(!Page.IsPostBack){if(linkmanID > -1){BindPageData(linkmanID);}}

    ///设置按钮的可用性

    int[] idList = { linkmanID };

    ListControl[] list = {ddlGroup};

    ButtonEnable.ControlButtonEnable(btnUpdateAndReturn,idList,list);

}

private void BindPageData(int linkmanID)

{   ///绑定组的数据

    Group group = new Group();

    Web2ASPNET2.CommonOperation.DataBinder.BindListData(

            ddlGroup,group.GetGroups(),"Name","ID");

        ///获取单个记录信息

        Linkman linkman = new Linkman();

        SqlDataReader dr = linkman.GetSingleLinkman(linkmanID);

        if(dr == null) return;

        if(dr.Read())

        {   ///显示信息

        tbName.Text = dr["Name"].ToString();

        tbEmail.Text = dr["Email"].ToString();

        ListSelectedItem.ListSelectedItemByValue(

        ddlGroup,dr["GroupID"].ToString());

    }dr.Close();

}

3.修改联系人

用户单击页面UpdateLinkman.aspx上的【保存,并返回管理页面】按钮,实现修改联系人属性的功能。该按钮首先将联系人修改后的信息提交到数据库之中,然后重定向到联系人管理页面GroupLinkmanManage.aspx。该按钮触发事件btnUpdateAndReturn_Click(object sender, EventArgs e)。

上述事件调用Linkman类的方法UpdateLinkman(int linkmanID,string name,string email),将修改后联系人的信息提交到数据库之中。若操作成功,则弹出“恭喜您,修改联系人信息成功……”的对话框。上述事件的程序代码如下:

protected void btnUpdateAndReturn_Click(object sender,EventArgs e)

{   ///执行修改操作

    Linkman linkman = new Linkman();

    if(linkman.UpdateLinkman(linkmanID,tbName.Text,tbEmail.Text) > 0)

    {

    Dialog.OpenDialogInAjax((Button)sender,"恭喜您,修改联系人信息成功……");

        ///返回管理页面

        if(ddlGroup.SelectedItem != null)

        {

            Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

                + ddlGroup.SelectedValue);

        }

    }

}

4.返回功能

用户单击页面UpdateLinkman.aspx上的【返回管理页面】按钮,可以重定向到联系人管理页面GroupLinkmanManage.aspx。如果ddlGroup控件选择了一个组,则该页面将显示该组的联系人。该按钮触发事件btnReturn_Click(object sender,EventArgs e),它的程序代码如下:

protected void btnReturn_Click(object sender,EventArgs e)

{   ///返回管理页面

    if(ddlGroup.SelectedItem != null)

    {

    Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

    + ddlGroup.SelectedValue);

}

else

{

    Response.Redirect("~/Portal/GroupLinkmanManage.aspx");

}

}

13.8.7  组内联系人管理

组内联系人管理由页面GroupLinkmanManage.aspx实现,它的代码隐藏文件为GroupLinkmanManage.aspx.cs。该页面实现下面4个功能。

*     以列表形式显示组内的联系人信息。

*     提供重定向到移动联系人页面、修改联系人属性页面的按钮。

*     提供删除联系人的功能。

*     提供重定向到添加新联系人页面的按钮。

页面GroupLinkmanManage.aspx以列表形式显示组内的联系人信息。该页面的最终效果如图13.51所示。

图13.51  添加新联系人的页面GroupLinkmanManage.aspx

1.界面设计

页面GroupLinkmanManage.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true"

    CodeFile="GroupLinkmanManage.aspx.cs"

    Inherits="Portal_GroupLinkmanManage" StylesheetTheme="Web2ASPNET2" %>

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server"

    Title="组内联系人管理" />

页面GroupLinkmanManage.aspx添加了一个GridView控件和一个Button控件,它们的ID属性的值分别为gvLinkman和btnAdd。gvLinkman控件以列表形式显示组内联系人的信息,如联系人的名称、电子邮件等;btnAdd控件重定向到添加新联系人的页面AddLinkman.aspx。页面GroupLinkmanManage.aspx的设计界面如图13.52所示。

图13.52  页面GroupLinkmanManage.aspx的设计界面

页面GroupLinkmanManage.aspx的HTML部分设计代码如下:

<asp:GridView ID="gvLinkman" runat="server" AutoGenerateColumns="False"

    Font-Names="Tahoma" Width="100%" SkinID="gvSkin" DataKeyNames="ID"

    OnRowCommand="gvLinkman_RowCommand"

    OnRowDataBound="gvLinkman_RowDataBound">

    <EmptyDataTemplate>联系人列表为空,您可用添加新的联系人</EmptyDataTemplate>

    <Columns>

        <asp:TemplateField HeaderText="名称"><ItemTemplate>

            <%# Eval("Name")%>

        </ItemTemplate></asp:TemplateField>

        <asp:TemplateField HeaderText="电子邮件"><ItemTemplate>

            <%# Eval("Email")%>

        </ItemTemplate></asp:TemplateField>

        <asp:TemplateField HeaderText="所属组"><ItemTemplate>

            <%# Eval("GroupName")%>

        </ItemTemplate></asp:TemplateField>

下述HTML代码为一个gvLinkman控件的一个模板列。该列显示了移动、编辑和删除联系人的图像按钮,即【】、【】和【×】按钮。按钮的CommandArgument属性保存它们所在行的联系人的ID值;CommandName属性的值保存它们执行操作的标识。其中,移动联系人按钮的CommandName属性的值为“move”、修改联系人按钮的CommandName属性的值为“update”、删除联系人按钮的CommandName属性的值为“del”。

        <asp:TemplateField HeaderText="操作"><ItemTemplate>

            <asp:ImageButton ID="ibtMove" runat="server" CommandName="move"

            ImageUrl="../App_Themes/Web2ASPNET2/Images/url.gif"

            AlternateText="移动该联系人" CommandArgument='<%#Eval("ID")%>'/>

            <asp:ImageButton ID="ibtUpdate" runat="server"

            CommandName="update"

            ImageUrl="../App_Themes/Web2ASPNET2/Images/update.gif"

            AlternateText="编辑该联系人" CommandArgument='<%#Eval("ID")%>'/>

            <asp:ImageButton ID="ibtDelete" runat="server"

            CommandName="del"

            ImageUrl="../App_Themes/Web2ASPNET2/Images/delete.gif"

            AlternateText="删除该联系人" CommandArgument='<%#Eval("ID")%>'/>

        </ItemTemplate></asp:TemplateField>

    </Columns>

</asp:GridView>

<asp:Button ID="btnAdd" runat="server" Text="添加新的联系人"

    CssClass="Button" OnClick="btnAdd_Click" SkinID="btnSkin"

    Width="150px"/>

2.页面初始化

页面GroupLinkmanManage.aspx首先引入了4个命名空间,它们分别为SqlClient、ASPNET2AjaxMail、CommonOperation和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using System.Data.SqlClient;

using Web2ASPNET2.ASPNET2AjaxMail;

页面GroupLinkmanManage.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据。它实现以下4个功能。

*     判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。

*     获取组的ID值,并保存在变量groupID中。

*     调用函数BindPageData(int groupID),显示由变量groupID的值指定组内的联系人。这些联系人信息显示在gvLinkman控件中。

*     根据变量groupID的值判断btnAdd按钮是否可用。如果该变量的值大于0,则该按钮可用;否则,不可用。

事件Page_Load(object sender,EventArgs e)和函数BindPageData(int groupID)的程序代码如下:

int groupID = -1;

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

    {   ///返回上一个页面

        Response.Write("<script>history.back()</script>");

        Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

        return;

    }

    ///获取组信息的ID

    if(Request.Params["GroupID"] != null)

    {

        groupID = DataTypeConvert.ConvertToInt(

            Request.Params["GroupID"].ToString());

    }

    ///显示数据

    if(!Page.IsPostBack){if(groupID > -1){BindPageData(groupID);}}

    ///设置按钮的可用性

    int[] idList = {groupID};

    ButtonEnable.ControlButtonEnable(btnAdd,idList);

}

private void BindPageData(int groupID)

{   ///绑定控件的数据

    Linkman linkman = new Linkman();

    Web2ASPNET2.CommonOperation.DataBinder.BindGridViewData(

        gvLinkman,linkman.GetLinkmanByGroup(groupID));

}

3.重定向和删除功能

页面GroupLinkmanManage.aspx为gvLinkman控件定义了RowCommand和RowDataBound事件,它们的名称分别为gvLinkman_RowCommand(object sender, GridViewCommandEventArgs e)和gvLinkman_RowDataBound(object sender, GridViewRowEventArgs e)。

当用户单击gvLinkman控件中的【】、【】或【×】按钮时,将触发第一个事件,该事件根据按钮的CommandName属性的值执行不同的操作。如果该属性的值为“update”,则重定向到修改联系人的页面UpdateLinkman.aspx;如果该属性的值为“move”,则重定向到移动联系人的页面MoveLinkman.aspx;如果该属性的值为“del”,则删除当前行的联系人。

第二个事件在行数据绑定之后触发,它为每一行的【×】按钮添加删除确认对话框。当用户单击【×】按钮时,页面首先弹出该对话框。上述两个事件的程序代码如下:

protected void gvLinkman_RowCommand(object sender,

    GridViewCommandEventArgs e)

{   ///重定向到编辑页面

    if(e.CommandName == "update")

    {

        Response.Redirect("~/Portal/UpdateLinkman.aspx?LinkmanID="

            + e.CommandArgument.ToString());

    }

    ///重定向到移动页面

    if(e.CommandName == "move")

    {

        Response.Redirect("~/Portal/MoveLinkman.aspx?LinkmanID="

            + e.CommandArgument.ToString());

    }

    if(e.CommandName == "del")

    {   ///执行删除操作

        Linkman linkman = new Linkman();

        linkman.DeleteLinkman(DataTypeConvert.ConvertToInt(

            e.CommandArgument.ToString()));

        BindPageData(groupID);///重新绑定控件数据

    }

}

protected void gvLinkman_RowDataBound(object sender,

    GridViewRowEventArgs e)

{   ///为删除按钮添加确认对话框

    ImageButton ibtDelete = (ImageButton)e.Row.FindControl("ibtDelete");

    if(ibtDelete != null)

    {

        ibtDelete.Attributes.Add("onclick",

            "return confirm('你确定要删除所选择的数据行吗?');");

    }

}

4.重定向添加新联系人的页面AddLinkman.aspx

用户单击页面GroupLinkmanManage.aspx上的【添加新的联系人】按钮,可以重定向到添加新联系人的页面AddLinkman.aspx。该按钮触发事件btnAdd_Click(object sender, EventArgs e),它的程序代码如下:

protected void btnAdd_Click(object sender,EventArgs e)

{   ///页面重定向

    Response.Redirect("~/Portal/AddLinkman.aspx?GroupID="

        + groupID.ToString());

}

13.8.8  移动联系人

移动联系人由页面MoveLinkman.aspx实现,它的代码隐藏文件为MoveLinkman.aspx.cs。该页面实现功能如下。

*     显示被移动联系人的名称、电子邮件以及所属组。

*     移动联系人,并将移动后的信息保存到数据库中。

*     返回联系人管理页面GroupLinkmanManage.aspx。

用户可以在页面MoveLinkman.aspx上设置联系人移动后的组。该页面的最终效果如图13.53所示。

图13.53  移动联系人的页面MoveLinkman.aspx

1.界面设计

页面MoveLinkman.aspx注册并使用了模块标题用户控件ModuleTitle.ascx,另外,它还使用了Web2ASPNET2主题。实现上述功能的程序代码如下:

<%@ Page Language="C#" AutoEventWireup="true"

    CodeFile="MoveLinkman.aspx.cs" Inherits="Portal_MoveLinkman"

    StylesheetTheme="Web2ASPNET2" %>

<%@ Register Src="../UserControl/ModuleTitle.ascx" TagName="ModuleTitle"

    TagPrefix="ucTitle" %>

<ucTitle:ModuleTitle ID="ModuleTitle1" runat="server" Title="移动联系人"/>

页面MoveLinkman.aspx添加了两个TextBox控件、两个Button控件、两个非空验证控件、一个正则表达式验证控件和一个下拉列表控件,它们的ID属性的值分别为tbName、tbEmail、btnReturn、btnUpdateAndReturn、rfName、rfEmail、reEmail和ddlGroup。

tbName、tbEmail控件分别用来显示联系人的名称和电子邮件;btnUpdateAndReturn控件移动联系人,并重定向到联系人管理页面GroupLinkmanManage.aspx;btnReturn控件重定向到联系人管理页面GroupLinkmanManage.aspx。

rfName、rfEmail控件分别对用户输入联系人的名称和电子邮件进行非空验证;reEmail控件验证用户输入的电子邮件的格式是否正确。页面MoveLinkman.aspx的设计界面如图13.54所示。

图13.54  页面MoveLinkman.aspx的设计界面

页面MoveLinkman.aspx的HTML部分设计代码如下:

名称:<asp:TextBox ID="tbName" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="50" Width="300px"

    Enabled="False"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfName" runat="server"

    ControlToValidate="tbName" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

电子邮件:<asp:TextBox ID="tbEmail" CssClass="TextBox" runat="server"

    SkinID="tbSkin" MaxLength="255" Width="300px"

    Enabled="False"></asp:TextBox>

<asp:RequiredFieldValidator ID="rfEmail" runat="server"

    ControlToValidate="tbEmail" ErrorMessage="不能为空。"

    Display="Dynamic"></asp:RequiredFieldValidator>

<asp:RegularExpressionValidator ID="reEmail" runat="server"

    ControlToValidate="tbEmail" ErrorMessage="电子邮件格式不正确。"

    ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"

    Display="Dynamic"></asp:RegularExpressionValidator>

所属组:<asp:DropDownList ID="ddlGroup" runat="server" SkinID="ddlSkin"

    Width="300px"></asp:DropDownList>

<asp:Button ID="btnUpdateAndReturn" runat="server" CssClass="Button"

    Text="保存,并返回管理页面" Enabled="False"

    OnClick="btnUpdateAndReturn_Click" SkinID="btnSkin" />

<asp:Button ID="btnReturn" runat="server" CssClass="Button"

    Text="返回管理页面" CausesValidation="False" OnClick="btnReturn_Click"

    SkinID="btnSkin" />

2.页面初始化

页面MoveLinkman.aspx首先引入了4个命名空间,它们分别为CommonOperation、SqlClient、ASPNET2AjaxMail和UserCommonOperation,程序代码如下:

using Web2ASPNET2.CommonOperation;

using Web2ASPNET2.UserCommonOperation;

using System.Data.SqlClient;

using Web2ASPNET2.ASPNET2AjaxMail;

页面MoveLinkman.aspx在事件Page_Load(object sender,EventArgs e)中初始化其数据。它实现以下4个功能。

*     判断用户是否登录。如果用户未登录,则重定向到用户登录页面UserLogin.aspx。

*     获取被移动联系人的ID值,并保存在变量linkmanID中。

*     调用函数BindPageData(int linkmanID)在ddlGroup控件中显示供移动的组。

*     根据ddlGroup控件和变量linkmanID的值判断btnUpdateAndReturn按钮是否可用。如果ddlGroup控件不存在选择项,或者变量linkmanID的值小于0,则该按钮不可用;否则,可用。

事件Page_Load(object sender,EventArgs e)和函数BindPageData(int linkmanID)的程序代码如下:

int linkmanID = -1;

protected void Page_Load(object sender,EventArgs e)

{   ///判断用户是否登录

    UserInfo info = (UserInfo)UserCommonOperation.GetUserInfo(Session);

    if(info == null)

    {   ///返回上一个页面

        Response.Write("<script>history.back()</script>");

        Response.Redirect("~/Portal/UserLogin.aspx");   ///跳转到登录页面

        return;

    }

    ///获取被修改信息的ID

    if(Request.Params["LinkmanID"] != null)

    {

        linkmanID = DataTypeConvert.ConvertToInt(

            Request.Params["LinkmanID"].ToString());

    }

    ///显示被修改的数据

    if(!Page.IsPostBack){if(linkmanID > -1){BindPageData(linkmanID);}}

    ///设置按钮的可用性

    int[] idList = { linkmanID };

    ListControl[] list = {ddlGroup};

    ButtonEnable.ControlButtonEnable(btnUpdateAndReturn,idList,list);

}

private void BindPageData(int linkmanID)

{   ///绑定组的数据

    Group group = new Group();

    Web2ASPNET2.CommonOperation.DataBinder.BindListData(

        ddlGroup,group.GetGroups(),"Name","ID");

    ///获取单个记录信息

    Linkman linkman = new Linkman();

    SqlDataReader dr = linkman.GetSingleLinkman(linkmanID);

    if(dr == null) return;

    ///显示信息

    if(dr.Read())

    {

        tbName.Text = dr["Name"].ToString();

        tbEmail.Text = dr["Email"].ToString();

        ListSelectedItem.ListSelectedItemByValue(

        ddlGroup,dr["GroupID"].ToString());

    }

    dr.Close();

}

3.修改联系人

用户单击页面UpdateLinkman.aspx上的【保存,并返回管理页面】按钮实现移动联系人的功能。该按钮首先将移动后联系人的信息提交到数据库之中,然后重定向到联系人管理页面GroupLinkmanManage.aspx。该按钮触发事件btnUpdateAndReturn_Click(object sender, EventArgs e)。

上述事件调用Linkman类的方法MoveLinkman(int linkmanID,int groupID)将移动后联系人的信息提交到数据库之中。若操作成功,则弹出“恭喜您,移动联系人信息成功……”的对话框。上述事件的程序代码如下:

protected void btnUpdateAndReturn_Click(object sender,EventArgs e)

{   ///执行修改操作

    Linkman linkman = new Linkman();

    if(linkman.MoveLinkman(linkmanID,

        DataTypeConvert.ConvertToInt(ddlGroup.SelectedValue)) > 0)

    {

    Dialog.OpenDialogInAjax((Button)sender,"恭喜您,移动联系人信息成功……");

        ///返回管理页面

        if(ddlGroup.SelectedItem != null)

        {

            Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

                + ddlGroup.SelectedValue);

        }

    }

}

4.返回功能

用户单击页面MoveLinkman.aspx上的【返回管理页面】按钮,可以重定向到联系人管理页面GroupLinkmanManage.aspx。如果ddlGroup控件选择了一个组,则该页面将显示该组的联系人。该按钮触发事件btnReturn_Click(object sender,EventArgs e),它的程序代码如下:

protected void btnReturn_Click(object sender,EventArgs e)

{   ///返回管理页面

    if(ddlGroup.SelectedItem != null)

    {

        Response.Redirect("~/Portal/GroupLinkmanManage.aspx?GroupID="

            + ddlGroup.SelectedValue);

    }

    else{Response.Redirect("~/Portal/GroupLinkmanManage.aspx");}

}

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论