必知的技术知识:GridView详解

简介: 必知的技术知识:GridView详解

写在前面asp.NET2.0中GridView恐怕是我们用得最多的一个数据列表控件了(与此相当的是Repeater)


下面从设置它的数据源到它的数据绑定,再到它的显示设置来说说GridView的用法.(可以看出本文实在只是个总结贴,没啥技术含量,欢迎大家补充说明)


No.1 数据源:


对于GridView来说,只要是序列化的数据都可以作为数据源.比如对象数组/XML/Table等等,只要你能想象到的,可以转化成一张表的东西.


如果图省心的话,可以配合DataSource控件来使用它,那么对数据的操作就可以集中在DataSource中处理,双剑合璧挖,省时又省心.


其绑定数据源的步骤就是:1.指定数据源:gridview.Datasource=xxx;2.绑定数据源:gridview.DataBind();


No.2 数据的绑定:


GridView在我们绑定数据源之后会默认自动根据数据生成列,但是有时候,我们会手动指定数据源而不用DataSource控件,并且需要更多样化的数据绑定和控制,所以,使用模板列来绑定数据,并对模版内的控件定位就成了关键:(这里我把用GridView自带列绑定数据省略掉了,如果有时间,我会把这里放在本文的最下面的附录里)


1.设置模板列


在Design(设计)模式下,GridView右上角有个小三角,点击它就可以对GridView进行更多操作,比如对列进行编辑;如果添加了模板列的话,还可以在这里对模板列进行编辑.


在"显示"这里,点击下拉列表,选择Item Template(这里是主要的显示处,所放进来的东西会在GridView的普通状态下显示),我们可以随便往里面填什么(基本上所有可以显示数据的控件都可以放进来帮助我们绑定并显示数据).//代码效果参考:http://www.jhylw.com.cn/410334975.html


比如我们拖进来一个Label,然后点击Label右上角的小三角就可以设置其的数据绑定了.


如果用一个设置好的DataSource控件做数据源,那么就可以直接在里面选择要绑定的字段及其显示格式,系统帮我们自动生成代码;


如果是自己指定数据源.....那么我们就只好自己来设置绑定了,可以在这里直接输入Eval("需要显示的字段"),也可以切换到代码,在里面写.对于Label来说,可能的写法是:.


自己书写最大的好处就是:我们可以任意在里面填写我们所需要的代码!比如:


瞧,这意味着我们可以对该绑定的数据进行一定的修饰,然后再显示.如果该数据控件是一个类似GridView的可以帮定数据列的,那么我们甚至可以给它指定一个返回数据源的函数!


在"显示"这里,点击下拉列表,选择EditItem Template(所放进来的东西会在GridView的编辑状态下显示--即GridView.EditIndex等于该行时),我们需要往里面放我们希望在编辑该数据时要显示的东西,比如一个TextBox(在这里,同样可以给控件指定要绑定的数据).


代码可能是这样的:


然后GridView里面的全部代码可能是这样的:


给GridView添加一个RowEditing事件:


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)


{


this.GridView1.EditIndex = e.NewEditIndex;


}


运行一下,显示正常,点击Edit会发现显示的数据被放进了一个TexBox,这样我们就可以对它进行编辑了.


2.在GridView的RowDataBound事件中,设置详细的绑定数据


在上面我们使用模板列来控制数据绑定以后基本上可以控制大部分数据的详细显示了.但是可能有人觉得这样写不太好看(页面和代码根本没分离嘛),或者我们在GridView里使用了UserControl而带来的绑定错误(因为在GridView给控件绑定数据时,UserControl还没有初始化)等原因,所以可以在这个事件里进行详细的绑定设置.


从名字上就可以知道,该事件是GridView的一行被绑定后才触发的.由于具体的行绑定涉及到行内数据的定位,所以就放在下面来说明如何使用RowDataBound,在这里,我们大概说下它的过程:首验证传回的e.Row是否被创建完全,然后从e.Row里用FindControl(ControlID)来获取ID为ControlID的控件,最后给控件赋值即可.需要注意的是,如果用的是GridView自带的列,则在RowDataBound中就是不同的方法来寻找了.


由于数据的绑定完全在后台代码中实现,我们可以更加自由地去修改和绑定数据了.


No.3 GriView中的控件/数据定位:


在GridView中寻找一个数据并不是简简单单地一个this.GridView1.XXX那么简单,因为毕竟我们在后台写代码的时候,GridView里面的数据/数据模板还没有生成呐.所以一般来说,我们采用的方法是先确定该数据/数据模板所在的行,然后根据其类型来从该行提取它(在这里我们就可以看到,这也是一个假定该行已经被完全创建,且该行包含我们要找的数据/数据模板----因此使用的时候请首先确认执行该代码前,代码所需要的行已经被创建).


要获取GridView自生成的列,可以用this.GridView1.Rows【index】.Cells【index】.Text;


而模版列,则要用this.GridView1.Rows【index】.Cells【index】.FindControl(string ControlID)或者是this.GridView1.Rows【index】.FindControl(string ControlID).


检查GridView的行是否被创建,可以用Row.RowType == DataControlRowType.DataRow(其中Row是我们要检验的GridView行).


下面介绍常用的2种定位,各有各的优缺点,使用事件常常得到的是一个行,而使用Button控件的数据绑定则可以根据绑定的不同得到特定的数据.


1.使用GridView自带事件进行定位:


下面我列出可能用到的事件(这里默认控件名为GridView1)


protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)


{


//用GridView的Select列时,可以使用这个方法


//e.NewSelectedIndex;//当前要选择的行,获取的是GridView当前页的index


}


protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)


{


//this.GridView1.SelectedValue.ToString();


//当前要选择的行的DataKeys,获取的是GridView当前页的DataKeys,


//比如可以设置GridView的DataKeys是数据源里的"ID"那么这里获取的就是当前选中行的数据的ID.


//需要注意的是,SelectedValue只有在SelectedIndexChanged中才有值,其他时候是null;


}


protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)


{


//e.RowIndex;//当前要提交的行,获取的是GridView当前页的index


}


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)


{


//e.NewEditIndex;//当前要编辑的行,获取的是GridView当前页的index


}


protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)


{


//e.RowIndex;//当前要删除的行,获取的是GridView当前页的index


}


protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)


{


//e.RowIndex;//当前要撤消编辑的行,获取的是GridView当前页的index


}


protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)


{


//e.NewPageIndex;//当前要到的页,获取的是GridView要切换页的index


}


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)


{


if (e.Row.RowType == DataControlRowType.DataRow && e.Row.RowIndex != GridView1.EditIndex)


{


//e.Row;//当前已经生成,并绑定好数据的行;


}


}


2.使用Button中的CommandArgument属性来绑定ID,进而获取要编辑、删除、提交、选择的行.


比如可能的代码是这样的:


然后在Button1_Click这个事件中,我们就可以用((Button)sender).CommandArgument来获得绑定的数据


3.使用GridView.XXX来进行定位.


问题回来了,现在我们要讨论的是如何用GridView这种常用而又熟悉的方式来从GridView中获取我们想要的数据.


在GridView中,可以存放2种数据:一种可以显示出来的,呈现给我们的是一个表格形式,那就是我们通常所使用GridView.Row或者Column来获取到的;一种是不显示的,但是我们可以在后台使用,可以使用GridView.DataKeys来设置和获取其值;


不管是哪种数据,只要不是GridView的属性,就需要我们在GridView完全生成以后才能获取.


1)数据表格


就像前面所说,GridView仅仅将数据生成了一个表格,所以获取的方式无非就是GridView.Row(GridView.Column主要用来设置整个列的属性,所以一般不用来获取里面的值),下面就是一个例子,我给每行的第2列中的btnAdd这个Button添加一个小属性:


foreach (GridViewRow gr in GridView)


{


((Button)gr.Cells【1】.FindControl("Button")).Attributes.Add("onclick", "alert('Clicked me!')");


}


2)DataKeys


如果是DataKeys中的数据,那么就可以直接使用GridView.DataKeys【编号或者绑定的Key的名称】来获取.比如我在开始的时候设置GridView.DataKeyNames="id";那么等到所有数据绑定完成后,就可以用GridView.DataKeys【"id"】来获取该行数据id的值了.


这样的好处是显而易见的,如果我希望能获取该行的特定字段值,而又不让其在页面上显示,那么这种方法最好不过了.


基本先说到这儿,其他的以后再加,欢迎大家讨论和提点意见

相关文章
|
1月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
9天前
|
前端开发 Android开发 UED
安卓应用开发中的自定义控件实践
【10月更文挑战第35天】在移动应用开发中,自定义控件是提升用户体验、增强界面表现力的重要手段。本文将通过一个安卓自定义控件的创建过程,展示如何从零开始构建一个具有交互功能的自定义视图。我们将探索关键概念和步骤,包括继承View类、处理测量与布局、绘制以及事件处理。最终,我们将实现一个简单的圆形进度条,并分析其性能优化。
|
1月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件基础与进阶
【10月更文挑战第5天】在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将通过浅显易懂的语言和实例,引导你了解自定义控件的基本概念、创建流程以及高级应用技巧,帮助你在开发过程中更好地掌握自定义控件的使用和优化。
39 10
|
2月前
|
缓存 前端开发 Android开发
安卓应用开发中的自定义控件
【9月更文挑战第28天】在安卓应用开发中,自定义控件是提升用户界面和交互体验的关键。本文通过介绍如何从零开始构建一个自定义控件,旨在帮助开发者理解并掌握自定义控件的创建过程。内容将涵盖设计思路、实现方法以及性能优化,确保开发者能够有效地集成或扩展现有控件功能,打造独特且高效的用户界面。
|
2月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义控件
【9月更文挑战第5天】在安卓开发的海洋中,自定义控件如同一艘精致的小船,让开发者能够乘风破浪,创造出既独特又高效的用户界面。本文将带你领略自定义控件的魅力,从基础概念到实战应用,一步步深入理解并掌握这一技术。
|
3月前
|
Android开发 UED 开发者
安卓开发中的自定义控件基础
【8月更文挑战第31天】在安卓应用开发过程中,自定义控件是提升用户界面和用户体验的重要手段。本文将通过一个简易的自定义按钮控件示例,介绍如何在安卓中创建和使用自定义控件,包括控件的绘制、事件处理以及与布局的集成。文章旨在帮助初学者理解自定义控件的基本概念,并能够动手实践,为进一步探索安卓UI开发打下坚实的基础。
|
XML 设计模式 Android开发
Android自定义控件 | 运用策略模式扩展单选按钮和产品经理成为好朋友
变化是永恒的,产品需求稳定不变是不可能的,和产品经理互怼是没有用的,但有一个方向是可以努力的:让代码更有弹性,以不变应万变。 继上一次发版前突然变更单选按钮样式之后,又新增了两个和选项按钮有关的需求。
123 0
|
算法 Android开发
Android自定义控件 | 高可扩展单选按钮(再也不和产品经理吵架了)
产品需求的变更总是随心所以,猝不及防。如何让代码变得更有扩展性,以让我们在面对频繁需求变更时,不至于狼狈不堪?
228 0
|
C# 索引
#WPF的3D开发技术基础梳理
原文:#WPF的3D开发技术基础梳理 自学WPF已经有半年有余了,一遍用,一边学。但是一直没有去触摸WPF的3D开发相关技术,因为总觉得在内心是一座大山,觉得自己没有能力去逾越。
1366 0
|
XML 前端开发 Android开发
D1-从N角星开始论述自定义控件
零、前言 [1].个人对安卓绘制逻辑感到繁琐,自己封装了一个绘图框架 [2].自定义控件的绘制流程都基于我的这个库,详见:开源计划之--Android绘图库--LogicCanvas [3].
1248 0