遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

GridView 的一些使用技巧


   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);

posted on 2008-07-03 11:34  遗忘海岸  阅读(600)  评论(0编辑  收藏  举报