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" />
<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") %>' />
<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");}
}







