不知大家是怎么使用asp.net中的gridview控件的。
我原先的做法是采用别人写的分页控件来实现对于数据的分页以及排序,某一天我看到一个例子是使用ObjectDataSource中的分页,然后感觉恍然大悟,呵呵,原来GridView还是非常强悍的。采用这种方式后,分页和排序就会变得非常容易,而且代码量非常小,通用也减轻了程序出错的可能。
不知大家是怎么使用asp.net中的gridview控件的。
我原先的做法是采用别人写的分页控件来实现对于数据的分页以及排序,某一天我看到一个例子是使用ObjectDataSource中的分页,然后感觉恍然大悟,呵呵,原来GridView还是非常强悍的。采用这种方式后,分页和排序就会变得非常容易,而且代码量非常小,通用也减轻了程序出错的可能。
下面我把我的系统的东西展现给大家,希望能够听取大家的一些建议:
1.程序的平台是VS2005,VS2008虽然我没有用过,但是应该也可以
2.系统我分了两层:DAO层和表现层。DAO层采用了NHibernate+NHBurrow组件,表现层采用了Vs2005中的GridView。
表现层的代码是这样子的:

Code
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" DataSourceID="ObjectDataSource1"
AutoGenerateColumns="False" Width="100%" AllowSorting="True" DataKeyNames="Id">
<Columns>
<asp:TemplateField FooterText="是否选中" HeaderText="是否选中">
<ItemTemplate><input name="cbx_select" type="checkbox" value='<%#Eval("ID")%>'/></ItemTemplate>
<HeaderTemplate><input id="cbx_CheckAll" type="checkbox" onclick= "ToggleCheckAll(this, 'cbx_select')"/></HeaderTemplate>
<HeaderStyle Width="10px" />
</asp:TemplateField>
<asp:BoundField DataField="Id" HeaderText="#" SortExpression="Id" />
<asp:BoundField DataField="UserName" HeaderText="用户名" />
<asp:BoundField DataField="LastName" HeaderText="姓名" />
<asp:BoundField DataField="Tel" HeaderText="电话" />
<asp:TemplateField HeaderText="角色" SortExpression="UserType.Id">
<ItemTemplate><%#Eval("UserType.Name")%></ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="城市" SortExpression="Orgnization.Id">
<ItemTemplate><%#Eval("Orgnization.Name")%></ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="TrainOrgId" HeaderText="培训机构" />
<asp:BoundField DataField="Email" HeaderText="电子邮件" />
<asp:BoundField DataField="LastIp" HeaderText="最后登录IP" />
<asp:CheckBoxField DataField="IsActive" HeaderText="有效" />
</Columns>
</asp:GridView>
上面这块代码比较简单,说的意思就是GridView1采用了ObjectDataSource1作为绑定数据源,下面的代码是数据源的定义;

Code
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server" SelectMethod="GetUsersByRole"
EnablePaging="True" SelectCountMethod="CountUsersByRole" MaximumRowsParameterName="pageSize" StartRowIndexParameterName="startRow"
SortParameterName="sortExpression" OldValuesParameterFormatString="original_{0}"
TypeName="Mpc.Core.Dao.UserDao">
<SelectParameters>
<asp:ControlParameter ControlID="ddlRoles" Name="roleId" PropertyName="SelectedValue"
Type="String" />
</SelectParameters>
</asp:ObjectDataSource>
上面这一小段代码是ObjectDataSource1的定义,定义主要包括以下几个主要部分:
1.对象数据源对应的类:TypeName="Mpc.Core.Dao.UserDao";
2.获取对象集合的方法名称:SelectMethod="GetUsersByRole"
3.分页控制需要四个参数:
- EnablePaging="True" ,说明对象数据源允许分页
- SelectCountMethod="CountUsersByRole" ,分页中需要计算总的数据条数,这是计算数据条数的方法名称
- MaximumRowsParameterName="pageSize" , 每一页条数参数的名称
- StartRowIndexParameterName="startRow", 某一页的起始索引的参数名称
4.排序:SortParameterName="sortExpression",这是排序表达式的参数名称
5.查询语句对应的参数集合:<SelectParameters></SelectParameters>在这里定义。
看到这里,大家对于对象数据源的GridView以及ObjectDataSource就应该有基本的印象了。下面再简单的描述一下DAO层需要提供的两个方法,一是获取对象集合的方法,一是获取总记录行数的方法。

Code
/// <summary>
/// 根据角色查询用户(分页)
/// </summary>
public IList<User> GetUsersByRole(string roleId, int startRow, int pageSize, string sortExpression)
{
ICriteria crit = base.CreateCriteria();
crit.Add(Expression.Eq("UserType.Id", Int32.Parse(roleId)));
return base.Find(startRow, pageSize, sortExpression, crit);
}
public int CountUsersByRole(string roleId)
{
ICriteria crit = base.CreateCriteria();
crit.Add(Expression.Eq("UserType.Id", Int32.Parse(roleId)));
return base.Count(crit);
}
上面代码中的第一个方法是根据角色查询对应的用户集合列表。
其中第一个参数roleId是查询条件,定义在页面中的<SelectParameters>上面,这个参数可以通过Session/控件等来进行变量传递,例子中的这个值是与页面上的一个控件进行了绑定。
后面的几个参数startRow,pageSize, sortExpression主要是来控制分页的。这几个参数的名称要与页面上定义的参数名称一致。
代码非常简单,主要是采用了NHibernate来实现分页查询。有关具体的Hibernate的详细内容,请大家自己学习一下。在这里插入一点自己的体验,我用Hibernate已经好长时间了,感觉他确实能提高开发效率,而且程序更加易懂。但是NHibernate的学习曲线比较长,不要指望一下子就能掌握它,如果在团队中引入它的话,最好有这方面的经验的人参与开发。至于Nhibernate的效率问题,更是需要对NHIbernate有非常深的理解,否则开发的程序允许效率可能会有大问题。
第二个方法主要是用来获取查询的总条数的语句,这个没有什么可说的了。只要是分页,都必须要有此方法。