gridview操作大全

翻译|其它|编辑:郝浩|2007-09-07 15:06:01.000|阅读 1083 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

一、GridView    DataGrid  的异同

GridView    DataGrid  的后继控件,在.net framework 2 中,虽然还存在  DataGrid,但是  GridView  已经走上了历史的前台,取代  DataGrid  的趋势已是势不可挡。GridView    DataGrid  功能相似,都是在  web  页面中显示数据源中的数据,将数据源中的一行数据,也就是一条记录,显示为在  web  页面上输出表格中的一行。

GridView  相对于  DataGrid  来说,具有如下优势,功能上更加丰富,因为提供了智能标记面板(也就是  show smart tag)更加易用方便,常用的排序、分页、更新、删除等操作可以零代码实现!具有  PagerTemplate  属性,可以自定义用户导航页面,也就是说分页的控制更加随心所欲。GridView    DataGrid  在事件模型上也多有不同之处,DataGrid  控件引发的都是单个事件,而  GridView  控件会引发两个事件,一个在操作前发生,一个在操作后发生,操作前的事件多位***ing事件,操作后的事件多位***ed事件,比如  Sorting  事件和  sorted  事件,RowDeleting    RowDeleted  事件。

二、GridView  操作初步

1、显示数据源中的数据

  ToolBox  中选取  GridView  控件拖到页面上,然后点击右键,选择  Show Smart Tag,  Choose Data Source  中选择  New Data Source, 出现  Data Source Configuration Wizard,选择连接字符串,可以选择已经存放在  web.config  中的  ConnectionString ,然后可以选择是使用存储过程,还是从表或视图中选择数据。

在这一步,左侧的  Where  语句可以指定查询条件,点击  Where,出现  Add Where Clause ,选择要设定条件的列,操作符是等于还是  like  还是其它,然后选择  Source,也就是说要限定的条件从哪里取值,可以是  ControlSessionFormCookieQueryStirng  等,如果选择  Control,那么需要在右侧,选中是那个控件,然后还可以设定默认值,设定完后系统自动生成  Sql  表达式和值的表达式,此时点击  Add  按钮,完成条件的添加,Where Cluase  下出现刚刚添加的条件。如果没有点击  Add,很容易设定了条件,但是因为没有添加到  Where  子句中,所以不起作用。

在这一步,左侧的  Order By,可以让我们设定排序列,就是我们取出的记录要按照什么派逊,可以设定三个列,是升序还是降序。

在这一部,左侧的  Advanced,可以设定  Advanced Sql Generation Options,这里可以生成这个查询的  InsertupdateDelete  语句,当然,前提是您选择的字段中必须包含了主键。当您想在  GridView  中不编写任何代码实现对表格的编辑、删除等操作时,就必须在配置数据源时,在这里生成  InsertUpdateDelete  这些语句。 GridView  中编辑删除等操作的零代码,就是根据配置数据源时自动生成的这些语句来完成数据源的更新删除等操作的。

在最后一步,您可以测试一下您刚刚生成的查询是否正确,最后点击完成,数据已经出现在页面上了,按  Ctrl+F5运行。

2、让  GridView  可以分页

GridView  把数据显示出来了,但是那么多条记录罗列到一页上是不合适的,我们应该对数据进行分页。还记得在  asp  时代,分页是多么的麻烦,需要编写很多的代码,而且各种分页组件也应运而生。而在  GridView  中,您会发现,分页是如此的简单,只需要您轻点鼠标,在  Show Smart Tag  中,选中  Enable Paging,表格的分页操作变完成了,是不是  So Easy  呢。

并不是什么数据源都可以让  GridView  实现自动分页的,比如如果  DataSourceMode  DataReader,就无法实现自动分页。而且只有  ObjectDataSource  是界面级别的支持分页,类似我们常用的  SqlDataSource  都是先提取所有的记录,然后只显示本页需要显示的记录,然后抛弃其余的记录,都有点浪费资源的啦!

  GridView    AllowPaging  属性设置为  True  的时候,我们实现了分页,我们还可以对分页进行一些个性化的设置。常用的属性包括:PageIndex――设置数据显示的当前页面,默认是0,也就是数据的首页。PageSize ――也就是一页显示多少条记录,默认为10条。在  PagerSettings  中,还可以对分页的导航按钮进行详细设置,在  Mode  属性中,可以设置:Numeric――默认的,分页用数字表示,123……NextPreviousNextPreviousFirstLastNumericFirstLast  均可顾名思义,显示上一页、下一页、首页、末页等。当  Mode  设定不是  Numeric  时,那么可以通过设定  FirstPageTextLastPageText  等属性来实现分页导航时,到首页、末页、下页、上页时显示的文字提示。

如果想实现分页界面的完全自动控制,还可以点击  GridView  右键,选择编辑模版-PagerTemplate  来实现,在模版中加入若干个  Button  控件,然后将  Button  控件的  CommandName  属性设置为  Page,  CommandArgument  属性分别设置为  FirstLastPrevNext  或者一个数字,即可实现分页操作。

3GridView  中的编辑、删除、排序

数据从数据源中提取出现,显示在网页上后,我们如果需要对其中的数据进行编辑、更新、删除等操作,还是不需要编写任何代码,利用  GridView  内置的功能即可实现。

在智能标记中,点击编辑列,在  Avaliable Fields  中,选择  ComandField,然后双击Edit,update,cancel    Delete,我们就为  GridView  添加了编辑和删除功能。如果在配置数据源的时候,我们已经生成了  Insertupdatedelete  这些语句,那么我们现在就可以执行程序。点击页面上的  Edit,出现  Update    Cancel  按钮,同时当前行除了主键以外的列,数值都放在了一个文本框中,可以进行编辑,然后点击  Update  即可保存。点击  Delete,删除当前行记录。您是不是已经被  GridView  强大的功能折服了呢?

  Show Smart Tag  中,选择  Enable Sorting,这时所有列的  Header  都变成了一个超链接,其实这些都是一个  LinkButton  控件,运行代码,在网页生成的数据表中,点击第一行中的列名,即可按照当前列进行排序,再次点击则反向排序。

如果您只需要对其中的几列进行排序,可以在智能标记中,选择编辑列,选中要排序的列,然后在右侧的属性中找到  SortExpression  属性,然后从下拉框中选择根据哪个字段排序,一般当然是当前字段咯,完成排序的设置。如果您不需要这一列参与排序,那么只需要把此列的  SortExpression  属性后面的值删除,也就是说设置成空字符串即可。试一试,是不是排序已经尽在掌握之中了呢?

三、GridView  中的自定义列

GridView  可以根据数据源自动生成列,但是如果我们需要自定义列的显示方式,让  GridView  的列完完全全的由我们自己来控制,我们就需要用到一种特殊的列――TemplateField。因为  GridView  生成的列都是一个字段一列,如果我们需要把两个字段合并为一列显示呢?我们可以使用模板列。我们可以指定包含标记和控件的模版,自定义列的布局和行为,我们可以新建一个模版列,也可以直接把已经生成的列转换为模版列来进行个性化的设置。

  GridView  上单击右键,选择编辑模版,在弹出菜单中选择要编辑的列,出现列模版的编辑画面。其中  HeaderTemplate――自定义列的标头部分显示的内容,FooterTemplate――脚注部分显示哪谌荩?/SPAN>ItemTemplate――是打开网页后此列数据显示的内容,EditItemTemplate――此列处于编辑状态时如何显示,AlternatingItemTemplate――交替项显示的内容,也就是说为了显示效果,可以隔行分别以不同的风格显示。

Example 1

我们现在假设有一个表,其中有一个字段是  username,我们现在产生一个自定义列,自定义列中包含此人的照片,同时我们假定照片的路径为  image/username.jpg。我们首先右键点击  GridView,在智能标记中,选择编辑列,添加一个模版列,然后编辑模版中的  ItemTemplate,加入一个  Image  控件,然后右键点击  Image  控件,选择  Edit DataBindings,在  ImageUrl  中设置  Field Binding,首先我我要  Bound to  数据源中的某列,因为所有图片的路径和格式是相同的,唯有名字不同而已,所以我们这里选中  username  字段,在  format  中,我们要自己定义其格式,输入  image/{0}.jpg, {0}代表的就是上面绑定的字段,下面有一个  Two Way DataBinding  的复选框,就是是否双向绑定的意思,如果单向绑定,一般采用  Eval,也就是说数值只从数据源传到页面上,如果双向绑定,也就是采用  Bind  的话,对数据的修改可以回传到数据源之中。

  web  页面执行时,不同的行因为  username  不同,图片的名字也会做出相应的替换。点击确定,然后执行当前网页,我们就可以看到在我们的自定义列中显示出了用户的照片。

Example 2

在数据库中,存储性别的时候,一般采用bit数据类型,存储为  True  或者  False,在  GridView  自动生成列的时候,一般使用  CheckedBoxField  列来显示  bit  类型的数据,显示在网页上就是一个单选框,如果选中,也就是  Checked  了,就是男的,否则就是女的。这样看起来,很不直观,下面我们通过自定义列将性别显示为男、女。

首先在  GridView    Show Smart Tag  中,选择编辑列,然后双击  TemplateFields ,添加了一个模版列,确定后,点击右键选择编辑模版,选中刚添加的列。在  ItemTemplate  中添加一个  DropListDown  控件,然后编辑它的数据绑定,Edit DataBinding,把  SelectedValue  属性绑定到性别列。

  DropListDown  控件中选择  Edit Item,就是编辑其下拉列表的项,我们添加两个  Item,一个的  Text  属性是男,Value  设置为  True,一个的  Text  属性设置为女,Value  属性设置为  False。到这里,你明白了么?因为  DropDownList  控件的显示文本和其值是可以不一样的,我们用数据绑定取到了性别这一列的值,True  或者  False,然后反映到  DropDownList  控件上,如果值为  True,因为  Text  属性为男的  Item    Value    True,所以我们现在运行网页,在新添加的列中,显示的不再是单选框或者  Truefalse  这些没有含义的东西,而是以下拉列表的方式显示出了当前用户是 男还是女。

四、自定义列中的数据更新

假设数据库中有一个"权限"字段,值为0代表未审核用户,为1代表一般用户,为9则代表管理员用户。根据前面所说的自定义列的办法,通过对  DropListDown  的绑定,在网页中显示权限为 "管理员",而不是显示数字9。问题产生了,如果我们调整用户权限的话,比如把一般用户更改为管理员,在编辑模版中的用户权限的下拉列表,如何把它的值返回给数据源来完成更新操作。

我们在  EditItemTemplate  中设置的  DropListDown  控件,必须选中了  Two Way DataBinding,也就是数据双向帮定,这样才能返回数据。前面我们谈到,在  GridView  中,事件不是单个的,是两个,一个是发生前,一个是发生后,因为我们需要在数据更新前把下拉列表的权限值传送出去,所以我们需要对  GridView1_RowUpdating  进行编码,编码如下:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{

//当前编辑的是哪行?

            int index = GridView1.EditIndex;

//取得当前编辑行的  GridViewRow  对象

            GridViewRow gvr = GridView1.Rows[index];

//在当前行中,寻找  DropListDown  控件

            DropDownList dp = (DropDownList)gvr.FindControl("editdrop");

//  DropListDown  的值赋给  NewValues  集合中的权限字段。

            e.NewValues["rights"] = dp.SelectedValue;

}

2RowDataBound  事件

在创建  gridView  控件时,必须先为  GridView  的每一行创建一个  GridViewRow  对象,创建每一行时,将引发一个  RowCreated  事件;当行创建完毕,每一行  GridViewRow  就要绑定数据源中的数据,当绑定完成后,将引发  RowDataBound  事件。如果说我们可以利用  RowCreated  事件来控制每一行绑定的控件,那么我们同样可以利用  RowDataBound  事件来控制每一行绑定的数据,也就是让数据如何呈现给大家。

还举同样的例子,在数据表中,存在性别列,上面我们用  DropListDown  控件的  DataBounding  来表示出了中文的性别,但是毕竟不太美观,我们现在可以利用  Label  控件和  RowDataBound  事件来实现完美的中文性别显示。

首先,还是把性别列,设置为模板列,并添加一个  Label  控件,将  Label  控件绑定到数据源的性别段,然后我们在  GridView  控件属性的事件列表中双击  RowDataBound,生成如下事件:

Example

        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)

{

//判断当前行是否是数据行

            if (e.Row.RowType == DataControlRowType.DataRow)

            {      //  FindControl  方法找到模板中的Label控件

Label lb1= (Label)e.Row.FindControl("Label1");

//因为  RowDataBound  是发生在数据绑定之后,所以我们可以

//判断  Label  绑定的数据,如果是  True,就更改其  text  属性为男

                    if (lb1.Text== "True")

                          lb1.Text = "";

                    else

                          lb1.Text = "female";

            }

        }

3RowType

RowType  可以确定  GridView  中行的类型,RowType  是玫举变量  DataControlRowType  中的一个值。RowType  可以取值包括   DataRowFooterHeaderEmptyDataRowPagerSeparator。很多时候,我们需要判断当前是否是数据行,通过如下代码来进行判断

       if (e.Row.RowType == DataControlRowType.DataRow)

4RowDeleting    RowDeleted  事件

RowDeleting  发生在删除数据之前,RowDeleted  发生在删除数据之后。

使用  RowDeleting  事件,可以在真正删除前再次确认是否删除,可以通过设置GridViewDeleteEventArgs.Cancel=True  来取消删除;也可以用于判断当前数据库记录数,如果只剩一条记录且数据库不能为空则提示并取消删除操作。

使用  RowDeleted  事件,可以在删除后,通过  GridViewDeletedEventArgs    Exception  属性判断删除过程中是否产生异常,如无异常,则可以显示类似于” 1 Records deleted” 之类的提示信息。

Example

        protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)

{

//取得当前行号,并取得当前行的  GridViewRow  对象

            int index=e.RowIndex ;

            GridViewRow gvr=GridView1.Rows[index];

//取得当前行第二个单元格中的文字

            str1 = gvr.Cells[1].Text;

//进行提示

            Message.Text      ="您将删除一个用户,其姓名为"+str1 ;

        }

        protected void GridView1_RowDeleted(object sender, GridViewDeletedEventArgs e)

{

//如果没有产生异常,则提示成功删除,否则提示删除失败

            if (e.Exception == null)

                Message.Text += "<br>您成功删除了"+str1 ;

            else

                Message.Text += "删除失败,请联系管理员";

}

5RowEditing事件

  GridView  中的行进入编辑模式之前,引发  RowEditing  事件,如果您需要在编辑记录前进行某些预处理,可以在这里操作。如果想取消对当前行的编辑,可以把  GridViewEditEventArgs  对象的  Cancel  属性设置为  true 即可。

Example

        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)

{

//  NewEidIndex  取得当前编辑的行号,然后获取  gridviewrow  对象

            GridViewRow gvr = GridView1.Rows[e.NewEditIndex];


//
判断,如果当前编辑行姓名栏为  admin  用户,则取消对当前行的编辑

            if (gvr.Cells[1].Text =="admin")

                e.Cancel = true;

}
6
RowUpdating    RowUpdated  事件

RowUpdating  事件发生在更新数据源之前,RowUpdated  发生在更新数据源之后。

我们可以在记录更新前利用  RowUpdating  做一些预处理工作,比如修改密码时,因为密码在数据库中不是明文存储,进行了  hash,所以在更新密码前,应该生成其  hash  值,再进行更新操作。RowUpdated  则可以检验更新是否成功。

Example

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

        {

            GridViewRow gvr = GridView1.Rows[GridView1 .EditIndex      ];

//寻找输入密码的控件

            TextBox tb1 = (TextBox)gvr.FindControl("tb_password");

//将此控件中的文本  hash  后,把  password  存入  NewValues  这个字典中

            e.NewValues ["password"] =tb1.Text .GetHashCode().ToString () ;
        }

        protected void GridView1_RowUpdated(object sender, GridViewUpdatedEventArgs e)

{

//如无异常,则更新成功

            if (e.Exception == null)

                Message.Text += "更新成功!";

        }


7
KeysOldValuesNewValues  集合

Keys  字典中一般存放的是数据源中的主键字段的  key    value  的对应值,如果主键由多个字段组成,那么  Keys  为每个键字段添加其字段名称和值。OldValues  中存放的是要更新的行的字段名和原始值,每个字段为其中的一项。NewValues  中存放的是要更新的行的字段名和修改后的值,每个字段为其中的一项。注意,主键字段只存放于  keys  集合中。

这三个集合中的每一项都是  DictionaryEntry  类型的对象,我们可以用  DictionaryEntry.Key  来确定一个项的字段名称,  DictionaryEntry.Value  来确定某项的值。

在上面的例子中,为了把密码明文加密后再存入数据库,我们利用了  NewValues  字段,重新设置  key    password  的项的值。为了保证安全性,我们在更新数据前对  NewValues  中的所有值进行  html  编码:

Example1:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{

//遍历  NewValues,取得其中每一对  DictionaryEntry  对象

           foreach (DictionaryEntry de in e.NewValues)


//de.key 
就是字段名,如果此处单独更新某字段的话,也可以直接填写字段名,//比如 e.NewValues[“password”]


           e.NewValues[de.Key] = Server.HtmlEncode(de.Value.ToString());

        }
Example2:

        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)

{

//分别利用  KeysOldValuesNewValues  取得主键名、原始数据和更新后数据

            Message .Text      = e.Keys["username"] + "  email  地址从" + e.OldValues["email"] + "变更为" + e.NewValues["email"];


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:csdn

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP