使用命令列有两种方式:
1.在“可选列”中添加相应的CommandField列的子项
2.在“可选列”中添加CommandField列,然后设置CommandField列的属性ShowEditButton、ShowDeleteButton等
一旦添加了命令按钮,我们就可以对GridView实现简单的修改和更新的操作了。但是如果要想实现删除操作的话还不行,还需要为GridView设置一个DataKeyNames属性。如果不设置此属性的话编译是没问题的,但运行时会产生“未提供参数”的异常,这一点切记。
DataKeyNames属性用来设置GridView对应的数据源的主键列,只有设置这个属性,在删除的时候才会把要删除的主键值传递给DataSource控件执行删除功能。
我们一起来看一下运行结果所存在的问题:
1.主键列Code不应当被编辑
2.GridView自动产生的文本框太宽,把我们的GridView都给挤变形了。
3.民族列在浏览时一直都显示民族代号,应当显示民族名称
4.民族列在修改的时候最好使用下拉列表让用户选择相应的民族。
5.文本输入框没有任何验证,对输错的信息在提交的时候会产生异常
6.删除时没有确认提示
7.删除时产生外键引用的异常
这里的问题实在是太多了,有的问题很简单就可以解决,但有的问题我们借助后面的模板列会更简单一些。
1、防止某列被编辑,只需要在“编辑列”对应框中将该列的ReadOnly属性设为true就可以了。
2、代码控制编辑状态下文本框的宽度(这种方式有点复杂,可以用模板列实现)
我们上面已经分析过GridView每一行的建造过程了,它包含“创建行”和“绑定行”两步操作,“创建行”的过程中会把一些静态的东西创建出来,当然也包含文本框的创建。因此我们只需要在RowCreated事件中把编辑列中的文本框的长度改变一下就可以了。
protected void GridView1_RowCreated(objectsender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
//这里可能是VS2005的一个Bug,所以我只好把整型强制转为DataControlRowState枚举类型再与e.Row.RowState属性进行比较
//4-Normal行的编辑状态,5-Alternating行处于编辑状态
if (e.Row.RowState ==(DataControlRowState)4||e.Row.RowState==(DataControlRowState)5)
{
//Width属性是Unit类型,不能直接赋整型值
//Unit.Pixel():按像素设置绝对宽度;Unit.Percent():按百分比设置宽度
((TextBox)e.Row.Cells[1].Controls[0]).Width =Unit.Pixel(60);
((TextBox)e.Row.Cells[3].Controls[0]).Width = Unit.Pixel(60);
((TextBox)e.Row.Cells[4].Controls[0]).Width =Unit.Pixel(100);
}
}
}
3.浏览状态时显示民族名称,只需要将实体中添加一个只读属性NationName,然后用它替换Nation字段,绑定到GridView就可以了。
4.对主表中的数据删除时级联删除相关子表数据
这种问题用很多种实现方式:
a.使用数据库中外键的级联删除功能
b.使用存储过程或触发器。
c.在程序代码中删除
前两种方式实现方式主要是数据库方面的知识,这里不多说了,下面我们主要看看如何使用程序代码删除数据。
当我们点击删除按钮的时候,GridView会自动把要删除的行对象传递给DataSource控件,然后DataSource调用相关的业务类的方法执行删除,再然后就发生“外键引用异常”......
整个这个过程是系统自动完成的,那我们要想自己写代码进行级联删除,并且禁止系统自动调用默认的删除功能,那如何实现呢?
大家会注意到其中的事件大部分都有两类:***ed和***ing两类。如:Deleted和Deleting事件
***ed事件:系统执先完操作后触发,如Deleted事件是系统调用默认删除功能,删除成功后自动触发
***ing事件:系统执行操作之前触发,如Deleting事件是系统调用默认删除功能之前触发。
现在大家应当清楚在点击删除按钮后如何添加自己的删除处理程序了,答案当然是应当在Deleting中编写代码进行级联删除。
主要代码如下:
protected void GridView1_RowDeleting(object sender,GridViewDeleteEventArgs e)
{
//取得要删除行的主键的值
string str =GridView1.DataKeys[e.RowIndex].Value.ToString();
//使用事务
using (TransactionScope ts = newTransactionScope())
{
//删除该主键值在删除简历表中对应的数据
new WorkDA().deleteInfo(str);
//删除该主键值在删除家庭关系表中对应的数据
new FamilyDA().deleteInfo(str);
//删除该主键值在基本信息表中对应的数据
new InfoDA().delete(str);
//提交事务
ts.Complete();
}
//取销事件进一步响影,即该删除操作不再往上提交至DataSource控件。