1任务4联系人分组管理2联系人分组管理窗体界面3为了以列表形式显示联系人分组信息,我们在窗体上用了一个新的控件DataGridView,该控件位于工具箱的“数据”选项卡内。设置DataGridView控件的Name属性为dgvGroupList,并修改Columns属性,添加3列,各列类型均为DataGridViewTextBoxColumn,如图所示:DataGridView控件各列属性设置属性设置列名称属性名称设置结果说明Column1HeaderText编号列标题文本DataPropertyNameId要绑定的数据列的名称VisibleFalse指定列是否可见Column2HeaderText分组名称列标题文本DataPropertyNameGroupName要绑定的数据列的名称VisibleTrue指定列是否可见Column3HeaderText备注列标题文本DataPropertyNameMemo要绑定的数据列的名称VisibleTrue指定列是否可见窗体上各按钮属性设置属性设置控件名称属性设置结果btnAddText增加btnDeleteText删除btnModifyText修改btnCloseText关闭6实现分组信息显示(1)首先在代码中添加对System.Data.SqlClient命名空间的引用:usingSystem.Data.SqlClient;(2)为窗体类定义如下的实例变量:SqlDataAdapterda;DataSetds;7实现分组信息显示(3)编写自定义方法Fill(),向DataGridView控件中填充数据:publicvoidFill(){stringsql=selectId,GroupName,MemofromContactGrouporderbyIddesc;using(SqlConnectionconn=newSqlConnection(DBHelper.connString)){da=newSqlDataAdapter(sql,conn);ds=newDataSet();da.Fill(ds);dgvGroupList.DataSource=ds.Tables[0];}}(4)在窗体的Load事件中调用Fill方法:privatevoidFormGourpList_Load(objectsender,EventArgse){Fill();}8运行程序,即可在窗体上显示出分组信息:9创建DataSet对象DataSetds=newDataSet();10SqlDataAdapter对象(1)创建数据库连接对象SqlConnectionconn=newSqlConnection(DBHelper.connString);(2)建立从数据库查询数据用的SQL语句stringsql=selectId,GroupName,MemofromContactGroup;(3)通过上面创建的SQL语句和数据库连接对象创建SqlDataAdapte对象SqlDataAdapterda=newSqlDataAdapter(sql,conn);(4)调用SqlDataAdapter对象的Fill方法向数据集中填充数据DataSetds=newDataSet();da.Fill(ds);11如果DataSet中已包含数据,我们可以通过下面的代码来访问第一个表中第i行第j列的数据(索引均从0开始):ds.Tables[0].Rows[i].ItemArray[j];还可以通过下面的代码获取数据表中记录的行数:ds.Tables[0].Rows.Count;结合使用SqlDataAdapter和DataSet,我们也可以用下面的代码来实现用户登录功能:stringconnString=DBHelper.connString;stringsqlStr=string.Format(select*from[User]whereUserName='{0}'andPassword='{1}',txtUserName.Text.Trim(),txtUserPassword.Text.Trim());using(SqlConnectionconn=newSqlConnection(connString)){SqlDataAdapterda=newSqlDataAdapter(sqlStr,conn);DataSetds=newDataSet();da.Fill(ds);if(ds.Tables[0].Rows.Count!=0)MessageBox.Show(登录成功!);elseMessageBox.Show(用户名或密码错误!);}12数据集中有了数据以后,我们只需设置DataGridView控件的DataSource属性,就可以显示数据了:dgvGroupList.DataSource=ds.Tables[0];13设计新增分组窗体:窗体中各控件属性设置属性设置控件类型控件名称属性设置结果LabellblGroupNameText分组名称lblGroupMemoText备注TextBoxtxtGroupNametxtGroupMemoMultilineTrueButtonbtnSaveText保存btnCloseText关闭15实现分组新增功能boolCheckGroupName(stringgroupName){boolcheck=true;if(groupName==){MessageBox.Show(分组名称不能为空);txtGroupName.Focus();check=false;}else{using(SqlConnectionconn=newSqlConnection(DBHelper.connString)){stringsql=string.Format(selectcount(*)fromContactGroupwhereGroupName='{0}',groupName);SqlCommandcmd=newSqlCommand(sql,conn);conn.Open();intn=Convert.ToInt32(cmd.ExecuteScalar());if(n=1){MessageBox.Show(分组名称重复,请修改!);txtGroupName.Focus();check=false;}}}returncheck;}16“保存”按钮的单击事件privatevoidbtnSave_Click(objectsender,EventArgse){stringgroupName=txtGroupName.Text.Trim();if(CheckGroupName(groupName)==false){return;}stringmemo=txtGroupMemo.Text.Trim();using(SqlConnectionconn=newSqlConnection(DBHelper.connString)){stringsql=string.Format(insertintoContactGroupvalues('{0}','{1}'),groupName,memo);SqlCommandcmd=newSqlCommand(sql,conn);conn.Open();intn=Convert.ToInt32(cmd.ExecuteNonQuery());if(n!=1){MessageBox.Show(添加分组失败!);}else{MessageBox.Show(添加分组成功!);}}}17“关闭”按钮的单击事件privatevoidbtnClose_Click(objectsender,EventArgse){this.Close();}窗体FormGroupList上的“增加”按钮编写单击事件privatevoidbtnAdd_Click(objectsender,EventArgse){FormGroupAddf=newFormGroupAdd();f.ShowDialog();Fill();}18“删除”按钮单击事件privatevoidbtnDelete_Click(objectsender,EventArgse){intid=0;try{id=(int)dgvGroupList.CurrentRow.Cells[0].Value;}catch(System.Exceptionex){MessageBox.Show(请选择有效数据行!);return;}if(MessageBox.Show(确定要删除吗?,询问,MessageBoxButtons.YesNo,MessageBoxIcon.Warning)!=DialogResult.Yes)return;using(SqlConnectionconn=newSqlConnection(DBHelper.connString)){stringsql=string.Format(selectcount(*)fromContactwhereGroupId={0},id);SqlCommandcmd=newSqlCommand(sql,conn);conn.Open();intn=Convert.ToInt32(cmd.ExecuteScalar());if(n=1){MessageBox.Show(该分组下存在联系人信息,不允许删除!);return;}}19using(SqlConnectionconn=newSqlConnection(DBHelper.connString)){stringsql=string.Format(deletefromContactGroupwhereId={0},id);SqlCommandcmd=newSqlCommand(sql,conn);conn.Open();intn=Convert.ToInt32(cmd.ExecuteNonQuery());if(n!=1){MessageBox.Show(删除失败!);}else{MessageBox.Show(删除成功!);}}Fill();}20设计修改分组信息窗体:窗体中各控件属性设置属性设置控件类型控件名称属性设置结果LabellblIdText分组编号lblGroupNameText分组名称lblGroupMemoText备注TextBoxtxtIdEnabledFalsetxtGroupNametxtGroupMemoMultilineTrueButtonbtnSaveText保存22实现分组信息修改(1)定义FormGroupDetail窗体的私有字段intid;(2)给FormGroupDetail窗体增加一个构造方法publicFormGroupDetail(intid){this.id=id;InitializeComponent();}23(3)补充FormGroupList窗体中“修改”按钮的单击事件代码privatevoidbtnModify_Click(objectsender,EventArgse){intid=0;try{id=(int)dgvGroupList.CurrentRow.Cells[0].Value;}catch(System.Exceptionex){MessageBox.Show(请选择有效数据行!);return;}FormGroupDetailf=newFormGroupDetail(id);f.ShowDialog();Fill();}24在FormGroupDetail窗体的Load事件中根据编号查询该分组信息privatevoidFormGroupDetail_Load(objectsender,EventArgse){txtId.Text=id.ToString();//编号已通过重载的构造方法传入stringconnString=DBHelper.connString;s