GridView在Asp.net 开发中使用比较普遍,当然网站性质的开发,在前台我们一般只用repearter,应该这个控件生成的代码最干净,不过在网站后台,用户管理后台这些地方,使用GridView能给你的工作带来很大的方便.
1. 使用ObjectDataSource
<fs:GridViewEx ID="gridViewEx" CssClass="bord_3" align="center" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" DataKeyNames="ID" Width="96%" EmptyDataText="没有相关数据" CheckBoxFieldHeaderWidth="3%" DataSourceID="odsTraderPhoto"
IsHoldState="True" SerialText="" OnRowCommand="gridViewEx_RowCommand">
<Columns>
<asp:ImageField DataImageUrlField="ThumImg" HeaderText="图片" NullImageUrl="~/img/def80x80.gif">
<itemstyle horizontalalign="Center" width="10%" />
<headerstyle horizontalalign="Center" />
</asp:ImageField>
<asp:BoundField DataField="Title" HeaderText="标题" >
<itemstyle horizontalalign="Left" width="50%" />
</asp:BoundField>
<asp:TemplateField HeaderText="排序" SortExpression="OrderID">
<itemstyle horizontalalign="Center" width="8%" />
<headerstyle horizontalalign="Center" />
<itemtemplate>
<asp:TextBox ID="txtOrderID" Text='<%#Bind("OrderID") %>' runat="server" Width="25px"></asp:TextBox><asp:ImageButton ID="butUpdateOrderID" CommandName="UpdateOrderID" CommandArgument='<%#Eval("ID") %>' runat="server" ImageUrl="images/edit.gif" />
<asp:RegularExpressionValidator ID="regValidate" runat="server" Display="Dynamic"
ErrorMessage="*" ValidationExpression="\d+" ControlToValidate="txtOrderID" ></asp:RegularExpressionValidator>
</itemtemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="操作">
<itemstyle horizontalalign="Center" width="15%" />
<headerstyle horizontalalign="Center" />
<itemtemplate>
<a href='/user/TraderPhotoEdit.aspx?id=<%#Eval("ID") %> '><img src="images/edit.gif" alt="编辑" /></a>
<asp:LinkButton ID="lnkDel" CommandName="Del" CommandArgument='<%#Eval("ID") %>' OnClientClick="return confirm('确定删除本条记录吗?本操作不可恢复!');" runat="server"><img src="images/del.gif" alt="删除" /></asp:LinkButton>
</itemtemplate>
</asp:TemplateField>
</Columns>
<AlternatingRowStyle BackColor="#F7F7DE" />
<EmptyDataRowStyle HorizontalAlign="Center" Height="100px" />
</fs:GridViewEx>
<asp:ObjectDataSource ID="odsTraderPhoto" runat="server" EnablePaging="True" SelectMethod="Query"
TypeName="O576SY.CN.BLL.TraderPhotoBLL" OnSelecting="odsTraderPhoto_Selecting" SelectCountMethod="QueryCount" SortParameterName="sortExpress">
<SelectParameters>
<asp:Parameter Name="username" Type="String" />
<asp:ControlParameter Name="key" Type="String" PropertyName="Text" ControlID="txtKey" DefaultValue="" />
</SelectParameters>
</asp:ObjectDataSource>
上面的代码中,我们在gridView中直接使用了align="center" ,虽然不是合法属性但是确能使用,这是asp.net2.0中比较人性的一点.
另外 <asp:Parameter Name="username" Type="String" /> 中的username用来传递用户名,用户名是放在form认证的cookie里的,一般无法通过asp:CookieParameter 来设置,因此我们使用 ObjectDataSource的Selecting 事件来传递这个参数如:
protected void odsTraderPhoto_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
e.InputParameters["username"] = User.Identity.Name;
}
注意在Selecting 事件中设置ObjectDataSource 的Select参数的默认值是无效的
odsTraderPhoto.SelectParameters["username"].DefaultValue = User.Identity.Name;
不过你可以通过page_Load事件进行设置, 如
protected void Page_Load(object sender, EventArgs e)
{
odsTraderPhoto.SelectParameters["username"].DefaultValue = User.Identity.Name; }
但是
protected void Page_Load(object sender, EventArgs e)
{
if(!IsPostBack ) {
odsTraderPhoto.SelectParameters["username"].DefaultValue = User.Identity.Name;
}
}
就会有安全问题,因为客户端可以伪造DataViewState来改变Username,当然你启用了DataViewState签名那就另当别论.
ObjectDataSource一般使用三层模式架购,下面是业务层的代码即objectDataSource绑定的方法
public static DataSet Query(int startRowIndex, int maximumRows, string username, string key, string sortExpress)
{
return dal.Query(startRowIndex, maximumRows, username, key, sortExpress, out RecordAmount);
}
private static int RecordAmount = 0;
public static int QueryCount(string username, string key)
{
return RecordAmount;
}
一般我们只使用GridView的Select 方法,而update,insert等会通过另外的表单(页面)实现,因为有些输入使用Gridview的编辑功能不够有好,或很难完成.
观察上面两个方法的参数可以发现 QueryCount 比 Query少了 3个参数,startRowIndex,maximumRows sortExpress,因为这三个是用来分页跟排序用的,而QueryCount只要统计记录数目就好,故不需要,不过当你使用分页时务必要有一个QueryCount 其参数跟相应的Query方法对应(除了上面的参数),
另外注意上面的RecordAmount 使用的静太定义字段,你也许会担心在asp.net这样的多用户环境下会不会出现错误,不过要知道Query后会马上接着调用QueryCount,这个过程很短,很难想像出现错误会是怎么个繁忙的景象.
2.在gridview的RowCommand中访问模版中控件
相信很多人多在使用gridview,中的RowCommand 进行删除,更新排序字段的操作,
这里 排序列使用 TemplateField 代码如下
<asp:TextBox ID="txtOrderID" Text='<%#Bind("OrderID") %>' runat="server" Width="25px"></asp:TextBox><asp:ImageButton ID="butUpdateOrderID" CommandName="UpdateOrderID" CommandArgument='<%#Eval("ID") %>' runat="server" ImageUrl="images/edit.gif" />
<asp:RegularExpressionValidator ID="regValidate" runat="server" Display="Dynamic"
ErrorMessage="*" ValidationExpression="\d+" ControlToValidate="txtOrderID" ></asp:RegularExpressionValidator>
这里我们还使用RegularExpressionValidator来验证输入的数据为数字, 在CommandArgument 我们帮定的是表的主键ID字段, 这个后面可以通过 gridview_RowCommand(object sender, GridViewCommandEventArgs e) 中的e.CommandArgument 来方便的获取,而txtOrderID的值通过如下方法获取(当然网上也有其他方法,不过用起来不是很方便)
TextBox txtOrderID=(e.CommandSource as Control).Parent.FindControl("txtOrderID") as TextBox;
int orderId=int.Parse( txtOrderID.Text);