版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第17章客户管理模块客户管理模块是整个客户关系管理系统中的关键部分,要求能详细的描述客户的信息,并能通过各种方式,方便的查询客户。整个客户管理模块的流程如图17-1所示。图17-1客户管理模块的流程图17.1客户资料的管理客户资料的管理主要实现对客户资料的添加、修改和查询等功能。17.1.1客户资料中常用的用户控件客户资料包括区域、行业类型、客户状态、客户等级4个属性,这些属性会出现在添加、修改和查询等很多功能中,而且这些属性的值都来源于数据库,本着软件重用性原则,将其设计成用户控件,实现一次设计,多次使用。前面已经设计好了“选择区域”用户控件,本节将采用相同的方法设计其他3个属性。行业类型不允许普通用户输入,只能通过下拉框选择,设计步骤如下:打开本例的网站项目SoftCRMo在controls目录下,添加一个用户控件,命名为UserTypeUC。在设计界面中,添加一个DropDownList控件。(4)为DropDownList控件新建数据源。数据源类型为“数据库”,数据连接选择“SoftERMConnnectionString”,表选择的是UserType,字段只选择一个:TypeName。按F7切换到代码视图,为该控件添加一个公共属性值,用来表示选择的值。具体代码可参考随书光盘。按"Ctrl+S”保存该用户控件。同样的步骤,再完成客户状态和客户等级2个用户控件。不同之处是客户状态选择的表是UserState,字段是StateName,客户等级选择的表是UserGrade,字段是GradeName。由于客户资料的属性繁多,而且涉及到的操作也很多,本章将使用业务实体类实现对客户资料的管理。17.1.2设计客户资料实体类生成客户实体类的方法有很多,本书推荐使用CodeSmith模板自动生成实体类。模板可以从网络下载,也可以参考随书光盘。首先在App_Code目录下,添加一个文件夹,命名为“EntityClass”,用于存放实体类。其次在EntityClass文件夹下,添加一个类,命名为“UserInfoEntity”。最后打开UserInfoEntity.cs文件,添加代码。本例客户资料实体类的代码如清单17-1所示。代码清单17-1客户资料实体类usingSystem;///<summary>///客户资料实体信息///</summary>publicclassUserInfoEntity(//定义私有变量privatestring_username="";privatestring_softversion="";privatestring_usertype="";privatestring_usergrade="";privatestring_userstate="";privatestring_city="";privatestring_address="";privatestring_linkman="";privatestring_phone="";privatestring_fax="";privatestring_mail="";privatestring_qq="";privateint_peopleamount=0;〃无参数的构造函数publicUserInfoEntity()(}///<summary>///有参数的构造函数,初始化客户资料///</summary>///<paramname="username”>客户全称</param>///<paramname="softversion">所用软件的版本</param>///<paramname="usertype">客户的业务类型</param>///<paramname="userstate”>客户状态</param>///<paramname="usergrade">客户等级</param>///<paramname="city">客户所在城市</param>///<paramname="address">客户的具体地址</param>Ill<paramname="linkman">客户单位的主要联系人</param>///<paramname="phone">联系电话<lparam>Ill<paramname="fax">传真</param>///<paramname="mail">客户的E-Mail</param>///<paramname="qq">主要联系QQ号</param>///<paramname="peopleamount">客户单位的人数</param>publicUserInfoEntity(stringusername,stringsoftversion,stringusertype,stringuserstate,stringusergrade,stringcity,stringaddress,stringlinkman,stringphone,stringfax,stringmail,stringqq,stringpeopleamount)(〃为私有变量赋值this._username=username;this._softversion=softversion;this._usertype=usertype;this._userstate=userstate;this._usergrade=usergrade;this._address=address;this._linkman=linkman;this._phone=phone;this._fax=fax;this._mail=mail;this._qq=qq;//注意类型的匹配this._peopleamount=int.Parse(peopleamount);}//客户名称属性publicstringUserName(get(return_username;}set{_username=value;}}〃软件版本属性publicstringSoftVersion{get{return_softversion;}set{_softversion=value;}}〃业务类型属性publicstringUserType{get{return_usertype;}set{_usertype=value;}}//客户等级属性publicstringUserGrade{get{return_usergrade;}set{_usergrade=value;}}//客户状态属性publicstringUserState{get{return_userstate;}set{_userstate=value;}}//客户所在城市属性publicstringCity{get{return_city;}set{_city=value;}}//客户地址属性publicstringAddress{get{return_address;}set{_address=value;}}//客户联系人属性publicstringLinkMan{get{return_linkman;}set{_linkman=value;}}//客户电话属性publicstringPhone{get{return_phone;}set{_phone=value;}}//客户传真属性publicstringFax{get{return_fax;}set{_fax=value;}}//客户Mail属性publicstringMail{get{return_mail;}set{_mail=value;}}//客户QQ属性publicstringQQ{get{return_qq;}set{_qq=value;}}//客户单位软员数量属性publicintPeopleAmount{get{return_peopleamount;}set{_peopleamount=value;}}}
17.1.3设计客户资料实体方法客户资料的主要方法有添加、修改和获取3个,而由于GridView控件可以无代码实现修改和获取,所以本例只有1个添加的方法。由于客户资料表与客户状态表、客户业务类型表、客户等级表、联系人表和城市表,通过ID有关联,所以实体中还有几个通过名称获取ID的私有方法。首先在App_Code目录下,添加一个文件夹,命名为EntityDA。用于存放实体方法类。其次在EntityDA文件夹下,添加一个类,命名为UserInfoDA。最后打开UserInfoDA.cs文件,添加所需要的代码。整个实体方法的工作流程如图17-2所示。客户资料实体方法的代码如清单17-2所示。客户资料实体方法入输
的户用添加客户资料类法方问访体实执行添加命令
InsertUserInfo返回名称添加到I数据库调用获取状态ID获取类型ID获取等级IDSQLServer图17-2实体方法工作的流程图代码清单17-2客户资料实体方法类入输
的户用添加客户资料类法方问访体实执行添加命令
InsertUserInfo返回名称添加到I数据库调用获取状态ID获取类型ID获取等级IDusingSystem;usingSystem.Data;usingSystem.Text;usingSystem.Data.SqlClient;///<summary>///客户资料实体的方法///</summary>publicclassUserInfoDA(//定义常量表示字段名称或SQL语句。privateconststringSQL_INSERT_USERINFO="INSERTINTOuserinfoVALUES(@cityid,@gradeid,@stateid,@typeid,@username,@useraddress,@softversion,@linkman,@phone,@mail,@qq,@fax,@peopleamount)”;//privateconststringSQL_UPDATE_USERINFO="updatememberinfosetcustname=@custname,custphone=@custphone,custaddress=@custaddress”;privateconststringPARM_USER_NAME="@username";privateconststringPARM_USER_ADDRESS="@useraddress";privateconststringPARM_USER_SOFTVERSION="@softversion";privateconststringPARM_USER_LINKMAN="@linkman”;privateconststringPARM_USER_PHONE="@phone";privateconststringPARM_USER_MAIL="@mail";privateconststringPARM_USER_QQ="@qq";privateconststringPARM_USER_FAX="@fax";privateconststringPARM_USER_PEOPLEAMOUNT="@peopleamount";privateconststringPARM_USER_CITYID="@cityid";privateconststringPARM_USER_STATEID="@stateid";privateconststringPARM_USER_GRADEID="@gradeid";privateconststringPARM_USER_TYPEID="@typeid";privateconststringPARM_USER_CITY="@city";privateconststringPARM_USER_STATE="@state";privateconststringPARM_USER_GRADE="@grade";privateconststringPARM_USER_TYPE="@type";privateconststringSQL_SELECT_CITYNAME="SELECTcityidFROMcityWHEREcityname=@city";privateconststringSQL_SELECT_STATENAME="SELECTstateidFROMuserstateWHEREstatename=@state";privateconststringSQL_SELECT_GRADENAME="SELECTgradeidFROMusergradeWHEREgradename=@grade";privateconststringSQL_SELECT_TYPENAME="SELECTtypeidFROMusertypeWHEREtypename=@type";//privateconststringSQL_SELECT_BYSOFTVERSION="";publicUserInfoDA()(}///<summary>///添加客户资料///</summary>///<paramname="user">客户资料实体</param>///<returns>添加是否成功〈/returns〉publicboolInsertUser(UserInfoEntityuser)(StringBuilderstrSQL=newStringBuilder();SqlParameter[]userParms=GetParameters();SqlCommandcmd=newSqlCommand();//依次给实体参数赋值userParms[0].Value=user.UserName;userParms[1].Value=user.Address;userParms[2].Value=user.SoftVersion;userParms[3].Value=user.LinkMan;userParms[4].Value=user.Phone;userParms[5].Value=user.Mail;userParms[6].Value=user.QQ;userParms[7].Value=user.Fax;userParms[8].Value=user.PeopleAmount;〃因为客户资料表中存储的是以下几个属性的ID//所以必须通过名称先获取这几个属性的ID〃获取城市的IDintcityid=GetCityID(user.City);〃获取用户状态的IDintstateid=GetStateID(user.UserState);〃获取用户等级的IDintgradeid=GetGradelD(user.UserGrade);〃获取用户业务类型的IDinttypeid=GetTypelD(user.UserType);userParms[9].Value=cityid;userParms[10].Value=stateid;userParms[11].Value=gradeid;userParms[12].Value=typeid;//遍历所有参数,并将参数添加到SqlCommand命令中foreach(SqlParameterparminuserParms)cmd.Parameters.Add(parm);〃获取数据库的连接字符串using(SqlConnectionconn=newSqlConnection(SqlHelper.ConnectionStringLocalTransaction))(strSQL.Append(SQL_INSERT_USERINFO);//打开数据库连接,执行命令conn.Open();〃设置Sqlcommand命令的属性cmd.Connection=conn;cmd.CommandType=CommandType.Text;cmd.CommandText=strSQL.ToString();〃执行添加的SqlCommand命令intval=cmd.ExecuteNonQuery();//清空SqlCommand命令中的参数cmd.Parameters.Clear();//判断是否添加成功,注意返回的是添加是否成功,不是影响的行数if(val>0)returntrue;elsereturnfalse;}}#region私有方法-获取ID///<summary>///获取城市ID的方法(私有方法)///</summary>///<paramname="cityname">城市名称</param>///<returns>该城市的ID</returns>privateintGetCityID(stringcityname)(intcityid=0;〃创建新参数并给参数赋值,用来指定城市名称SqlParameterparm=newSqlParameter(PARM_USER_CITY,SqlDbType.NVarChar,20);parm.Value=cityname;〃调用SqlHelper访问组件的方法返回第一行第一列的值cityid=(int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,SQL_SELECT_CITYNAME,parm);returncityid;}///<summary>///获取用户状态ID的方法(私有方法)///</summary>///<paramname="cityname">用户状态名称</param>Ill<returns>该状态的ID</returns>privateintGetStateID(stringstatename)(intstateid=0;II创建新参数并给参数赋值,用来指定用户状态的名称SqlParameterparm=newSqlParameter(PARM_USER_STATE,SqlDbType.NVarChar,20);parm.Value=statename;II调用SqlHelper访问组件的方法返回第一行第一列的值stateid=(int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,SQL_SELECT_STATENAME,parm);returnstateid;}III<summary>III获取用户等级ID的方法(私有方法)III<Isummary>III<paramname="cityname">用户等级名称<Iparam>III<returns>该等级的ID<Ireturns>privateintGetGradeID(stringgradename)(intgradeid=0;II创建新参数并给参数赋值,用来指定用户等级的名称SqlParameterparm=newSqlParameter(PARM_USER_GRADE,SqlDbType.NVarChar,20);parm.Value=gradename;II调用SqlHelper访问组件的方法返回第一行第一列的值gradeid=(int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,SQL_SELECT_GRADENAME,parm);returngradeid;}III<summary>III获取用户业务类型ID的方法(私有方法)III<Isummary>III<paramname="cityname">业务类型名称<Iparam>III<returns>该业务类型的ID<Ireturns>privateintGetTypeID(stringtypename)(inttypeid=0;II创建新参数并给参数赋值,用来指定用户等级的名称SqlParameterparm=newSqlParameter(PARM_USER_TYPE,SqlDbType.NVarChar,20);parm.Value=typename;II调用SqlHelper访问组件的方法返回第一行第一列的值typeid=(int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,SQL_SELECT_TYPENAME,parm);returntypeid;}#endregionII#region对客户资料的查询III<summary>III通过软件版本查询III<Isummary>III<paramname="softversion">软件版本号<Iparam>Ill<returns>数据集〈/returns〉//publicSqlDataReaderGetUsersBySoftVersion(stringsoftversion)//(IISqlDataReaderdr=newSqlDataReader();////创建新参数并给参数赋值,用来指定用户状态的名称//SqlParameterparm=newSqlParameter(PARM_USER_STATE,SqlDbType.NVarChar,20);//parm.Value=statename;//〃调用SqlHelper访问组件的方法返回第一行第一列的值//stateid=(int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,SQL_SELECT_STATENAME,parm);//returnstateid;//}//#endregionprivatestaticSqlParameter[]GetParameters()(//将SQL_INSERT_USERINFO做为哈希表缓存的键值SqlParameter[]parms=SqlHelper.GetCachedParameters(SQL_INSERT_USERINFO);//首先判断缓存是否已经存在if(parms==null)(〃缓存不存在的情况下,新建参数列表parms=newSqlParameter[](newSqlParameter(PARM_USER_NAME,SqlDbType.NVarChar,50),newSqlParameter(PARM_USER_ADDRESS,SqlDbType.NVarChar,100),newSqlParameter(PARM_USER_SOFTVERSION,SqlDbType.NVarChar,50),newSqlParameter(PARM_USER_LINKMAN,SqlDbType.NVarChar,20),newSqlParameter(PARM_USER_PHONE,SqlDbType.NVarChar,20),newSqlParameter(PARM_USER_MAIL,SqlDbType.NVarChar,20),newSqlParameter(PARM_USER_QQ,SqlDbType.NVarChar,20),newSqlParameter(PARM_USER_FAX,SqlDbType.NVarChar,20),newSqlParameter(PARM_USER_PEOPLEAMOUNT,SqlDbType.Int),newSqlParameter(PARM_USER_CITYID,SqlDbType.Int),newSqlParameter(PARM_USER_STATEID,SqlDbType.Int),newSqlParameter(PARM_USER_GRADEID,SqlDbType.Int),newSqlParameter(PARM_USER_TYPEID,SqlDbType.Int)};//将新建的参数列表添加到哈希表中缓存起来SqlHelper.CacheParameters(SQL_INSERT_USERINFO,parms);}//返回参数数组returnparms;}}17.1.4如何添加客户资料因为是客户关系管理系统,所以对于客户资料属性的设计非常详细,界面就会显得比较杂乱。为了有重点的让用户添加资料,可以把必须填写的属性放在上面,把次要的放在下面。设计步骤如下:(1)在controls文件夹下,添加一个用户控件,命名为“AddUser”。(2)打开AddUser.ascx文件,添加控件,如图17-3所示。其中使用了ValidationSummary验证控件,用于统一显示错误信息。因为本来界面上控件就很多,如果每个控件后面跟一个错误提示的话,界面显得不够简洁。后面带“*”的表示是必填项,使用RequiredFieldValidator验证。注意填写E-Mail的地方也使用了RegularExpressionValidator验证控件。图17-3添加客户资料功能设计界面双击“添加”按纽,切换到按纽的Click代码视图中,填写代码如清单17-3所示。代码清单17-3添加客户资料事件代码//判断页面验证是否正确if(Page.IsValid)(//初始化客户资料实体类UserInfoEntityuser=newUserInfoEntity();//填充实体属性user.UserName=txtusername.Text;user.SoftVersion=softversion.Text;user.UserState=UserStateUC2.SelectValue;user.UserType=UserTypeUC1.SelectValue;user.UserGrade=UserGradeUC1.SelectValue;user.City=txtcity.Text;user.Address=txtaddress.Text;user.LinkMan=txtlinkman.Text;user.Phone=txtphone.Text;user.Fax=txtfax.Text;user.Mail=txtmail.Text;user.QQ=txtqq.Text;//先判断是否为空user.PeopleAmount=txtpeople.Text==""?0:int.Parse(txtpeople.Text);〃调用添加方法UserInfoDAmyda=newUserInfoDA();boolresult=myda.InsertUser(user);//判断是否添加成功if(result)Labell.Text="添加成功";}按"Ctrl+S”保存控件。在网站目录下,添加一个Web窗体,命名为“AddUserPage”,应用母版页。将AddUser.ascx拖到界面的Content控件中。按"Ctrl+S”保存文件。将此页设置为起始页。按F5编译并运行程序,添加用户信息,单击“添加”按钮,查看是否能正常保存信息。17.1.5如何修改客户资料本节将使用GridView控件实现客户资料的修改,其中使用了模板列功能。首先设计一个包含修改功能的GridView控件。在controls目录下,添加一个用户控件,命名为“EditUser”。打开EditUser.ascx文件,拖放一个GridView控件到设计界面。为GridView控件创建数据源,类型为“数据库”,表选择“UserInfo”,字段选中全部。注意在“配置Select窗口”中,单击“高级”按钮,选中“生成nsert语句”复选框,因为此GridView控件要实现编辑功能。数据源配置完成后,系统会自动生成一个数据源控件SqlDataSource1。在其HTML代码中修改SelectCommand属性、UpdateCommand属性,还要修改UpdateParameters。具体内容参考代码清单17-4。代码清单17-4修改客户资料界面部分代码<asp:SqlDataSourceID="SqlDataSource1"runat="server”ConnectionString="<%$ConnectionStrings:SoftCRMConnectionString%>"DeleteCommand="DELETEFROM[UserInfo]WHERE[UserID]=@UserID"InsertCommand="INSERTINTO[UserInfo]([CityID],[GradeID],[StateID],[TypeID],[UserName],[UserAddress],[UserLinkman],[SoftVersion],[UserPhone],[EMail],[PeopleAmount],[Fax],[QQ])VALUES(@CityID,@GradeID,@StateID,@TypeID,@UserName,@UserAddress,@UserLinkman,@SoftVersion,@UserPhone,@EMail,@PeopleAmount,@Fax,@QQ)"SelectCommand="SELECTUserInfo.UserID,City.CityName,UserGrade.GradeName,UserState.StateName,UserType.TypeName,UserInfo.UserName,UserInfo.UserAddress,UserInfo.UserLinkman,UserInfo.SoftVersion,UserInfo.UserPhone,UserInfo.EMail,UserInfo.PeopleAmount,UserInfo.Fax,UserInfo.QQFROMUserInfoINNERJOINCityONUserInfo.CityID=City.CityIDINNERJOINUserStateONUserInfo.StateID=UserState.StateIDINNERJOINUserTypeONUserInfo.TypeID=UserType.TypeIDINNERJOINUserGradeONUserInfo.GradeID=UserGrade.GradeID"UpdateCommand="UPDATEUserInfoSETCityID=(SELECTCityIDFROMCityWHERE(CityName=@cityname)),GradeID=(SELECTGradeIDFROMUserGradeWHERE(gradename=@gradename)),StateID=(SELECTStateIDFROMUserStateWHERE(StateName=@statename)),TypeID=(SELECTTypeIDFROMUserTypeWHERE(TypeName=@typename)),UserName=@UserName,UserAddress=@UserAddress,UserLinkman=@UserLinkman,SoftVersion=@SoftVersion,UserPhone=@UserPhone,EMail=@EMail,PeopleAmount=@PeopleAmount,Fax=@Fax,QQ=@QQFROMUserInfoINNERJOINCityASCity_1ONUserInfo.CityID=City_1.CityIDINNERJOINUserTypeASUserType_1ONUserInfo.TypeID=UserType_1.TypeIDINNERJOINUserStateASUserState_1ONUserInfo.StateID=UserState_1.StateIDINNERJOINUserGradeASUserGrade_1ONUserInfo.GradeID=UserGrade_1.GradeIDWHERE(UserInfo.UserID=@UserID)"><DeleteParameters><asp:ParameterName="UserID"Type="Int32"/></DeleteParameters><UpdateParameters><asp:ParameterName="cityname"/><asp:ParameterName="gradename"/><asp:ParameterName="statename"/><asp:ParameterName="typename"/><asp:ParameterName="UserName"Type="String"/><asp:ParameterName="UserAddress"Type="String"/><asp:ParameterName="UserLinkman"Type="String"/><asp:ParameterName="SoftVersion"Type="String"/><asp:ParameterName="UserPhone"Type="String"/><asp:ParameterName="EMail"Type="String"/><asp:ParameterName="PeopleAmount"Type="Int32"/><asp:ParameterName="Fax"Type="String"/><asp:ParameterName="QQ"Type="String"/><asp:ParameterName="UserID"Type="Int32"/></UpdateParameters><InsertParameters><asp:ParameterName="CityID"Type="Int32"/><asp:ParameterName="GradeID"Type="Int32"/><asp:ParameterName="StateID"Type="Int32"/><asp:ParameterName="TypeID"Type="Int32"/><asp:ParameterName="UserName"Type="String"/><asp:ParameterName="UserAddress"Type="String"/><asp:ParameterName="UserLinkman"Type="String"/><asp:ParameterName="SoftVersion"Type="String"/><asp:ParameterName="UserPhone"Type="String"/><asp:ParameterName="EMail"Type="String"/><asp:ParameterName="PeopleAmount"Type="Int32"/><asp:ParameterName="Fax"Type="String"/><asp:ParameterName="QQ"Type="String"/></InsertParameters></asp:SqlDataSource><asp:GridViewID="GridView1"runat="server"AllowPaging="True"AutoGenerateColumns="False"DataKeyNames="UserID"DataSourceID="SqlDataSource1"Width="751px"><Columns><asp:CommandFieldShowEditButton="True"/><asp:BoundFieldDataField="CityName"HeaderText="城市"SortExpression="CityName"/><asp:BoundFieldDataField="GradeName"HeaderText="等级"SortExpression="GradeName"/><asp:BoundFieldDataField="StateName"HeaderText="状态"SortExpression="StateName"/><asp:BoundFieldDataField="TypeName"HeaderText="业务类i型"SortExpression="TypeName"/><asp:BoundFieldDataField="UserName"HeaderText="客户名"SortExpression="UserName"/><asp:BoundFieldDataField="UserAddress"HeaderText="地址"SortExpression="UserAddress"/><asp:BoundFieldDataField="UserLinkman"HeaderText="联系人"SortExpression="UserLinkman"/><asp:BoundFieldDataField="SoftVersion"HeaderText="软件版本SortExpression="SoftVersion"/><asp:BoundFieldDataField="UserPhone"HeaderText="电话”SortExpression="UserPhone"/><asp:BoundFieldDataField="PeopleAmount"HeaderText="公司人数"SortExpression="PeopleAmount"/><asp:BoundFieldDataField="Fax"HeaderText="传真"SortExpression="Fax"/><asp:BoundFieldDataField="EMail"HeaderText="EMail"SortExpression="EMail"/><asp:BoundFieldDataField="QQ"HeaderText="QQ"SortExpression="QQ"/></Columns></asp:GridView>单击GridView控件的任务列表,将“启用分页”和“启用编辑”两个复选框选中。此时列的名称都是英文,编辑GridView的列属性,具体如何编辑,参考代码清单17-4。此时虽然可以编辑字段,也可以保存,但在编辑等级和状态的时候,并没有出现下拉框让用户选择已经存在的等级和状态,这就得用到GridView的模板列。17.1.6如何设计GridView控件的模板列在第17.1.1节中,已经设计好了几个常用的用户控件,本节通过将其添加到GridView中,来学习模板列的使用方法。(1)打开EditUser.ascx文件,切换到设计视图。(2)打开GridView控件的任务菜单,选择“编辑列”菜单命令。打开字段编辑窗口,如图17-4所示。右下角有个“将此字段转换为TemplateField”超级链接,表示将某字段转换为模板列。图17-4字段编辑窗口(3)在“选定的字段”列表中,选中“状态”字段,单击“将此字段转换为TemplateField”超级链接。此时窗口不发生任何变化。(4)单击“确定”按钮,回到设计视图。此时只是把字段列定义为模板,还没有为模板设置实际内容。(5)打开GridView控件的任务菜单,选择“编辑模板”菜单命令。打开“模板编辑”视图。如图17-5所示。图17-5模板编辑视图(6)单击任务列表中的“显示”下拉框,会发现有一组名为“等级”的模板样式。(7)因为本例要求在编辑的时候,出现下拉框供选择,所以选择编辑模板“EditItemTemplate”。此时模板中显示的是一个TextBox控件。(8)删除TextBox,拖放UserStateUC.ascx控件到此视图。打开此控件的任务列表,会发现有一项“编辑DataBindings”,其用来设置此控件在GridView中显示的内容。(9)单击“编辑DataBindings”菜单命令。打开编辑窗口,如图17-6所示。图17-6编辑DataBindings视图(10)选中“显示所有属性”复选框,发现没有用户控件中自定义的属性。如果是.NET提供的控件,就可以在这里为其绑定值。而现在使用的是自定义的用户控件,系统没有识别控件的属性,所以此处不做任何修改,单击“确定”按钮。(11)单击模板任务列表中的“结束模板编辑”菜单命令,系统切换到设计视图。(12)按“Shift+F7”切换到HTML代码视图,查看UserState模板列的代码,如清单17-5所示。状态模板列中有两个模板,一个EditItemTemplate,用于编辑时显示的列内容,一个是ItemTemplate,用于在普通情况下显示列内容。代码清单17-5状态模板列HTML代码<asp:TemplateFieldHeaderText="状态”SortExpression="StateName"><EditItemTemplate><uc2:UserStateUCID="UserStateUC1"runat="server"/></EditItemTemplate><ItemTemplate><asp:LabelID="Label2"runat="server"Text='<%#Bind("StateName")%>'></asp:Label></ItemTemplate></asp:TemplateField>(13)为状态用户控件手动绑定值,修改模板列的EditItemTemplate属性,代码如清单17-6所示。主要是添加了SelectValue的属性。代码清单17-6状态模板列绑定编辑时内容<EditItemTemplate><uc2:UserStateUCID="UserStateUC1"runat="server"SelectValue='<%#Bind("StateName")%>'/></EditItemTemplate>(14)按“Ctrl+S”保存所有代码。按F5编译并执行程序,查看是否能以下拉框的方式修改用户状态列,并且测试是否能正常更新。如果对用户状态列的测试完全正确,以相同的步骤修改用户等级列和业务类型列。17.1.7如何查询客户资料客户关系管理系统的资料查询需要灵活多变,可以方便快速的实现对客户的搜索,还要求可以实现分类查询功能。本例要实现的分类查询是:按状态、按等级、按业务类型。要实现的查询是:按名称的模糊查询(不需要输入全名)、按城市查询、按软件版本查询。本节将简单的介绍使用GridView实现查询的步骤。(1)在controls文件夹下,添加一个用户控件,命名为ViewUser。(2)打开ViewUser.ascx文件,切换到设计视图,添加控件,如图17-7所示。图17-7查询资料功能设计界面(3)为GridView控件创建数据源SqlDataSource1,修改SqlDataSource1的SelectCommand命令。两个控件的最终设计,请参考代码清单17-7所示。代码清单17-7查询界面的GridView和数据源<asp:GridViewID="GridView1"runat="server"AutoGenerateColumns="False"DataKeyNames="UserID"DataSourceID="SqlDataSource1"Width="821px"><Columns><asp:BoundFieldSortExpression="UserName"/><asp:BoundFieldSortExpression="SoftVersion"/><asp:BoundFieldSortExpression="CityName"/><asp:BoundFieldSortExpression="GradeName"/><asp:BoundFieldSortExpression="StateName"/><asp:BoundFieldSortExpression="TypeName"/><asp:BoundFieldSortExpression="UserAddress"/><asp:BoundFieldSortExpression="UserLinkman"/><asp:BoundFieldSortExpression="UserPhone"/><asp:BoundFieldSortExpression="EMail"/><asp:BoundFieldSortExpression="PeopleAmount"/>DataField="UserName”DataField="SoftVersion"DataField="CityName”HeaderText="客HeaderText="软HeaderText="DataField="GradeName”DataField="StateName"HeaderText="HeaderText="DataField="TypeName"HeaderText="业DataField="UserAddress"DataField="UserLinkman"DataField="UserPhone"DataField="EMail"DataField="PeopleAmount"HeaderText="HeaderText="联系人”HeaderText="电话HeaderText="EMail"HeaderText="公司人数"<asp:BoundFieldDataField="Fax"HeaderText="传真"SortExpression="Fax"/><asp:BoundFieldDataField="QQ"HeaderText="QQ"SortExpression="QQ"/></Columns></asp:GridView><asp:SqlDataSourceID="SqlDataSource1"ConnectionString="<%$ConnectionStrings:SoftCRMConnectionString%>"UserInfo.UserID,runat="server"SelectCommand="SELECTUserGrade.GradeName,UserState.StateName,UserType.TypeName,UserInfo.UserAddress,UserInfo.UserLinkman,UserInfo.EMail,UserInfo.PeopleAmount,UserInfo.Fax,UserInfo.QQFROMUserInfoINNERJOINCityONUserInfo.CityID=City.CityIDINNERJOINUserStateONUserInfo.StateID=UserState.StateIDINNERJOINUserTypeONUserInfo.TypeID=UserType.TypeIDINNERJOINUserGradeONUserInfo.GradeID=UserGrade.GradeID"></asp:SqlDataSource>(4)编辑三个查询按钮的事件代码,如清单17-8所示。UserInfo.SoftVersion,City.CityName,UserInfo.UserName,UserInfo.UserPhone,代码清单17-8查询按钮的事件代码protectedvoidButton1_Click(objectsender,EventArgse)(//客户名称的模糊查询ControlParametercp=newControlParameter("username”,"txtusername","Text");〃获取Select语句,并添加条件stringstr=SqlDataSource1.SelectCommand;str+="whereusernamelike1%'+@username+‘%'”;〃更新Select语句SqlDataSource1.SelectCommand=str;//添加参数-必须先清空参数SqlDataSource1.SelectParameters.Clear();SqlDataSourcel.SelectParameters.Add(cp);//重新绑定数据GridView1.DataBind();}protectedvoidButton3_Click(objectsender,EventArgse)(//通过软件版本查询//建立一个与控件相关联的参数〃构造函数中第一个参数表示SQL语句中的参数名//第二个参数表示控件的ID,第三个参数表示控件的取值属性ControlParametercp=newControlParameter("softversion”,"txtsoftversion”,"Text");〃获取Select语句,并添加条件stringstr=SqlDataSource1.SelectCommand;str+="wheresoftversion=@softversion”;〃更新Select语句SqlDataSource1.SelectCommand=str;//添加参数-必须先清空参数SqlDataSource1.SelectParameters.Clear();SqlDataSource1.SelectParameters.Add(cp);//重新绑定数据GridView1.DataBind();}protectedvoidButton2_Click(objectsender,EventArgse)(//通过城市查询ControlParametercp=newControlParameter("cityname”,"txtcity","Text");〃获取Select语句,并添加条件stringstr=SqlDataSource1.SelectCommand;str+="wherecityname=@cityname";〃更新Select语句SqlDataSource1.SelectCommand=str;//添加参数-必须先清空参数SqlDataSource1.SelectParameters.Clear();SqlDataSource1.SelectParameters.Add(cp);//重新绑定数据GridView1.DataBind();}本例中分类查询使用的是下拉框控件,可以按照状态、等级、业务三个类别进行查找。首先要在下拉框控件中添加这3个项目,并将等级这个项目的Selected属性设置为true,表示为默认选择。在分类按钮中添加代码,如清单17-9所示。代码清单17-9分类查询代码〃分类查找〃获取Select语句stringstr="";//定义控件参数ControlParametercp=newControlParameter("name”,"txtseek”,"Text");switch(DropDownList1.SelectedValue)(case”等级”://定义查询语句str=SqlDataSource1.SelectCommand+"wheregradename=@name”;break;case”状态”:str=SqlDataSource1.SelectCommand+"wherestatename=@name";break;case"业务类型":str=SqlDataSource1.SelectCommand+"wheretypename=@name";break;}〃更新Select语句SqlDataSource1.SelectCommand=str;//添加参数-必须先清空参数SqlDataSource1.SelectParameters.Clear();SqlDataSource1.SelectParameters.Add(cp);//重新绑定数据GridView1.DataBind();(7)按"Ctrl+S”保存。说明:这样设计有一个缺点,就是在界面层使用了SQL语句和有关字段的信息,本例是为了读者阅读的连贯性如此设计,实际应用中可以将以上4个查询方法,添加到实体访问类中。在网站根目录下,添加Web窗体ViewUserPage,测试刚完成的查询客户资料控件。17.2联系人资料的管理联系人和客户的概念比较容易混淆,客户是购买或使用公司软件的企业。联系人是指与公司有业务往来的所有的人的名字,可以是公司的客户,也可以是公司的供应商。上一节重点介绍了客户资料的管理,两者在代码实现的步骤上没有太大区别。17.2.1添加联系人添加联系人和添加客户资料的方法相同,本节只给出基本步骤和部分代码。具体可参考17.1.4节。设计联系人资料的实体类,在“EntityClass”文件夹下,添加一个类,名称为“LinkmanEntity”。代码如清单17-10所示。代码清单17-10联系人资料实体类usingSystem;///<summary>///LinkmanEntity的摘要说明///</summary>publicclassLinkmanEntity(//定义私有变量privatestring_name="";privatestring_sex="";privatestring_phone="";privatestring_mail="";privatestring_qq="";privateDateTime_birthday;privatestring_like="";privatestring_note="";privatestring_companyname="";〃无参数的构造函数publicLinkmanEntity()(}///<summary>///有参数的构造函数,初始化联系资料///</summary>///<paramname="name”>联系人姓名</param>///<paramname="sex">性别</param>///<paramname="phone">电话</param>///<paramname="birthday">生日</param>///<paramname="mail">邮箱</param>///<paramname="qq">QQ号</param>///<paramname="like”>个人爱好</param>///<paramname="note”>备注</param>publicLinkmanEntity(stringname,stringsex,stringphone,DateTimebirthday,stringmail,stringqq,stringlike,stringnote,stringcompanyname)(〃为私有变量赋值this._companyname=companyname;this._name=name;this._sex=sex;this._phone=phone;this._birthday=birthday;this._mail=mail;this._qq=qq;this._like=like;this._note=note;}〃联系人名称属性publicstringName(get(return_name;}set{_name=value;}}//性别publicstringSex{get{return_sex;}set{_sex=value;}}〃电话属性publicstringPhone{get{return_phone;}set{_phone=value;}}//生日publicDateTimeBirthday(get(return_birthday;}set{_birthday=value;}}//客户Mail属性publicstringMail{get{return_mail;}set{_mail=value;}}//客户QQ属性publicstringQQ{get{return_qq;}set{_qq=value;}}〃联系人的个人爱好属性publicstringLike{get{return_like;}set{_like=value;}}〃联系人的备注属性publicstringNote{get{return_note;}set{_note=value;}}〃联系人所在单位的名称publicstringCompanyName{get{return_companyname;}set{_companyname=value;}}}设计联系人实体的访问方法,在“EntityDA”文件夹下,添加一个类,名称为LinkmanDA”。代码如清单17-11所示,流程如图17-8所示。联系人资料实体方法用户联系人详I细资料以联系人实体形式输入问访体实数reDl&nlas调用是否[成功
执行添加方法
InsertLinkmanI¥用户联系人详I细资料以联系人实体形式输入问访体实数reDl&nlas调用是否[成功
执行添加方法
InsertLinkmanI¥调用—返回行数ExcuteNonQuery执行添加方法根据单位判断是
否是公司的客户返回行数图17-8实体访问方法流程图代码清单17-11联系人资料实体访问方法usingSystem;usingSystem.Data;usingSystem.Text;usingSystem.Data.SqlClient;usingSystem.Configuration;///<summary>///LinkmanDA的摘要说明///</summary>publicclassLinkmanDA(//定义常量表示字段名称或SQL语句。privateconststringSQL_INSERT_LINKMAN="INSERTINTOlinkmanVALUES(@userid,@name,@phone,@mail,@qq,@birthday,@like,@sex,@note)”;privateconststringPARM_COMPANY_ID="@userid";privateconststringPARM_LINKMAN_NAME="@name";privateconststringPARM_LINKMAN_PHONE="@phone";privateconststringPARM_LINKMAN_MAIL="@mail";privateconststringPARM_LINKMAN_QQ="@qq";privateconststringPARM_LINKMAN_BIRTHDAY="@birthday";privateconststringPARM_LINKMAN_LIKE="@like";privateconststringPARM_LINKMAN_SEX="@sex";privateconststringPARM_LINKMAN_NOTE="@note";privateconststringPARM_COMPANY_NAME="@company";privateconststringSQL_SELECT_COMPANYNAME="SELECTuseridFROMuserinfoWHEREusername=@company";publicLinkmanDA()(}///<summary>///添加联系人资料///</summary>///<paramname="user">联系人资料实体</param>Ill<returns>添加是否成功〈/returns〉publicboolInsertLinkman(LinkmanEntitylinkman)(StringBuilderstrSQL=newStringBuilder();SqlParameter[]linkmanParms=GetParameters();SqlCommandcmd=newSqlCommand();II依次给实体参数赋值linkmanParms[1].Value=linkman.Name;linkmanParms[2].Value=linkman.Phone;linkmanParms[3].Value=linkman.Mail;linkmanParms[4].Value=linkman.QQ;linkmanParms[5].Value=linkman.Birthday;linkmanParms[6].Value=linkman.Like;linkmanParms[7].Value=linkman.Sex;linkmanParms[8].Value=linkman.Note;II因为联系人表中的USERID是用来存放联系人所在单位的I/所以必须通过名称先获取这单位的IDII获取单位的IDintuserid=GetCompanyID(linkman.CompanyName);〃如果userid为0,表示联系人所在单位并不是公司用户,将其设置为空。if(userid==0)(linkmanParms[0].Value=DBNull.Value;}〃遍历所有参数,并将参数添加到SqlCommand命令中foreach(SqlParameterparminlinkmanParms)cmd.Parameters.Add(parm);II获取数据库的连接字符串using(SqlConnectionconn=newSqlConnection(SqlHelper.ConnectionStringLocalTransaction))(strSQL.Append(SQL_INSERT_LINKMAN);〃打开数据库连接,执行命令conn.Open();〃设置Sqlcommand命令的属性cmd.Connection=conn;cmd.CommandType=CommandType.Text;cmd.CommandText=strSQL.ToString();〃执行添加的SqlCommand命令intval=cmd.ExecuteNonQuery();〃清空SqlCommand命令中的参数cmd.Parameters.Clear();〃判断是否添加成功,注意返回的是添加是否成功,不是影响的行数if(val>0)returntrue;elsereturnfalse;}}#region私有方法III<summary>III获取单位ID的方法III<Isummary>Ill<paramname="cityname">单位名称</param>///<returns>该单位的ID</returns>privateintGetCompanyID(stringcompanyname)(intuserid=0;//创建新参数并给参数赋值,用来指定单位名称SqlParameterparm=newSqlParameter(PARM_COMPANY_NAME,SqlDbType.NVarChar,20);parm.Value=companyname;//调用SqlHelper访问组件的方法返回第一行第一列的值try(userid=(int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionStringLocalTransaction,CommandType.Text,SQL_SELECT_COMPANYNAME,parm);}catch(〃出现错误时,设置为0userid=0;}returnuserid;}privatestaticSqlParameter[]GetParameters()(//将SQL_INSERT_LINKMAN做为哈希表缓存的键值SqlParameter[]parms=SqlHelper.GetCachedParameters(SQL_INSERT_LINKMAN);//首先判断缓存是否已经存在if(parms==null)(〃缓存不存在的情况下,新建参数列表parms=newSqlParameter[](newSqlParameter(PARM_COMPANY_ID,SqlDbType.Int),newSqlParameter(PARM_LINKMAN_NAME,SqlDbType.NVarChar,20),newSqlParameter(PARM_LINKMAN_PHONE,SqlDbType.NVarChar,20),newSqlParameter(PARM_LINKMAN_MAIL,SqlDbType.NVarChar,20),newSqlPa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高职设施农业工程技术(设施设计与建造)试题及答案
- 2025年高职(财务会计)固定资产核算阶段测试试题及答案
- 2026年职业兴趣综合测试(兴趣适配性评估)试题及答案
- 2025年中职社会保障事务(社保办理流程)试题及答案
- 2025 小学二年级科学下册学习养护多肉植物技巧课件
- 广告学专业就业趋势
- 政法暨安全生产讲解
- 2025河南洛阳市汝阳县审计局辅助性岗位招聘劳务派遣人员4人备考题库及参考答案详解
- 江西省宜春市高安市第九中学2025-2026学年上学期11月期中考七年级数学试题(含答案)
- 河南省濮阳市范县2024届高三下学期模拟测试(五)历史试题(含答案)
- 五年级上册英语阅读每日一练
- 农业生态种植技术标准操作规程
- 仪器设备的清洁消毒课件
- 2025年浙江高考物理试题答案详解解读及备考指导
- 急性肝衰竭的护理研究进展
- 多项目管理标准化框架
- 急性胃炎课件
- 市场监管局投诉举报课件
- DBJ∕T 15-182-2020 既有建筑混凝土结构改造设计规范
- 2.3.2 我国第一大河-长江(课件)2025-2026学年度人教版地理八年级上册
- “半城市化”地区的治理视角识别与综合评价体系构建研究
评论
0/150
提交评论