GridView是在ASP.NET2.0中新引入的一个控件,用于显示数据库中的记录以及分页、排序和修改等操作。GridView还能够使用客户端(client-side)脚本来进行排序和分页,以避免将整个页面发回。
要使用一个GridView控件显示数据集是很容易的,只需要一个GridView控件和一个DataSource,DataSource可以是SqlDataSource(表示来自于SQL数据库的记录集,如Microsoft SQL Server和Oracle数据库),ObjectDataSource,AccessDataSource等。在我所做的项目中,因为使用了Linq,所以多使用ObjectDataSource,下面的例子也是使用ObjectDataSource。
1、 显示数据集中的数据。
从Toolbox中拖一个GridView控件和一个ObjectDataSource到你的页面中,然后进行配置。
<asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" CellPadding="4" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" AutoGenerateDeleteButton="True" DataKeyNames="CategoryId" EnableSortingAndPagingCallbacks="True" PageSize="6" onselectedindexchanged="GridView1_SelectedIndexChanged" onpageindexchanged="GridView1_PageIndexChanged" onpageindexchanging="GridView1_PageIndexChanging">
<FooterStyle BackColor="#CCCC99" />
<RowStyle BackColor="#F7F7DE" />
<SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
<HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="CategoryID" HeaderText="Id" ReadOnly="True" SortExpression="CategoryID" />
<asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
DeleteMethod="DelteCategory"
SelectMethod="GetCategories" TypeName="CategoryService"
UpdateMethod="UpdateCategory" SortParameterName="orderBy">
<DeleteParameters>
</DeleteParameters>
<UpdateParameters>
</UpdateParameters>
<SelectParameters>
</SelectParameters>
<InsertParameters>
</InsertParameters>
</asp:ObjectDataSource>
GridView支持以下字段类型:
BoundField:以字符串形式显示字段的值
ButtonField:显示用户指定的按钮
CheckboxField:当字段类型为Boolean显示为一个CheckBox
CommandField:自动生成一个命令按钮,如Edit,Update 或者Cancel
HyperLinkField:将字段的值显示为一个超链接
ImageField:当字段的值表示一张图片时,显示该图片
TemplateField:用户可以通过提供一个Template来自定义某一列的显示。
可以使用NullDisplayText属性指定当某个字段的值为空是显示什么内容。
在将页面切换到Design标签,选中ObjectDataSource1,然后可以对其配置。可以设置TypeName,SelectMethod等属性。例如上面示例中就表示在类CategoryService中,有对数据库中Category表进行操作的方法,分别为GetCategories,DelteCategory,InsertCategory,UpdateCategory。这些方法的参数设置可以在ObjectDataSource内的< DeleteParameters >等标签中设置,如果所有参数都在GridView中的DataField中存在,可以不设置,在更新是会自动与各个方法中具有相同名字的参数进行匹配。注意在GridView中指定DataKeyNames,它使用指定的DataKey标记每一行。
例如上例中的Update方法是这样的:
public void UpdateCategory(int categoryID, string name, string description)
{
Category_Table category = TestDBUtility.DataContext.Category_Tables.Where(c => c.CategoryID == categoryID).FirstOrDefault();
if (category != null)
{
category.Name = name;
category.Description = description;
TestDBUtility.DataContext.SubmitChanges();
}
}
注意上面方法中参数。他们应当与DataField中指定的一样(大小写无关),如果有其他的参数,则需要在<UpdateParameters> </UpdateParameters>中指定。
2、分页与排序
要实现分页功能,只要设定GridView的AllowPaging属性为true即可,还可以通过PageSize属性设置页面显示的数据项数量。
要实现排序功能,可以将AllowSorting属性设置为true。然后再需要排序的列中设置SortExpression,一般SortExpression跟绑定的字段是一样的。接下来在ObjectDataSource中设置SortParameterName,这个SortParameterName应当与Select方法中的sort参数一样,例如在上例中,SelectMethod方法为:
public static List<Category_Table> GetCategories(string orderBy)
{
if (string.IsNullOrEmpty(orderBy))
{
return TestDBUtility.DataContext.Category_Tables.ToList();
}
else
{
return TestDBUtility.DataContext.Category_Tables.OrderBy(orderBy).ToList();
}
}
其中的参数orderBy用于对搜索结果进行排序,因此在ObjectDataSource中将SortParameterName设置为“orderBy”,当用户点击列表头时,就可以将SortExpression中指定的值传递给这个参数,从而完成排序。
注意:将GridView属性EnableSortingAndPagingCallbacks设置为true,可以允许客户端排序和分页,此时GridView使用Javascript从Web server请求更新的数据集(使用Microsoft Internet Explorer XMLHTTPRequest对象),而不是将整个页面全部发会。
3、更新和删除数据
将GridView属性AutoGenerateEditButton设置为true,就会在GridView表格中第一列显示一个Eidt,你也可以通过设置BoundField来设置命令按钮。点击Edit即可以实现对数据列进行编辑,要想将编辑的结果更新到数据库中,还需要在ObjectDataSource中提供UpdateMethod。
大多数情况下,GridView会将字符串自动转化为UpdateMethod中的参数类型,如将CategoryID转化为整型,将CheckBox转化为Boolean。但是有些类型却必须在DataSource中指定数据类型。
要实现删除功能,只要将AutoGenerateDeleteButton设置为true,并提供DeleteMethod方法即可。
4、在ObjectDataSource中使用Object type方法实现更新与删除
前面示例中使用的更新方法可以成为简单类型(Simple type)方法,接下来使用另外一种方法,称其为对象类型(Object type)方法。
为了编程方便,有时需要将数据库中的表以及字段对应到程序中的一个类中,这样通过类对象就可以实现对数据的更新以及增删,(在.NET3.5中,linq可以帮助我们快速的完成从数据库表到对象的转换),ObjectDataSource支持对对象类型进行更新和删除。只要设置DataObjectTypeName属性。同时UpdateMethod和DeleteMethod的参数也应当修改为DataObjectTypeName中指定的类型。
例如CategoryService中UpdateMethod的形式为:
public void UpdateCategory(Category_Table category)
{
Category_Table categoryObj = TestDBUtility.DataContext.Category_Tables.Where(c => c.CategoryID == category.CategoryID).FirstOrDefault();
if (categoryObj != null)
{
categoryObj.Name = category.Name;
categoryObj.Description = category.Description;
}
TestDBUtility.DataContext.SubmitChanges();
}
将ObjectDataSource中的UpdateMethod设置为UpdateCategory,将DataObjectTypeName设置为Category_Table,就可以实现更新操作。当用户在GridView中点击Update按钮后,系统会生成一个Category_Table实例,并使用修改行中的值给该实例中的属性赋值,然后作为参数传递给UpdateCategory方法,在UpdateCategory方法中,实现对数据库中该数据行的更新。
5、插入数据
插入数据可以通过与DetailsView联合实现,这个在后面的文章中介绍吧。