zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    MySQL 数据库报错 Too many connections
    C# 字符串倒序输出
    C# Guid.NewGuid()
    C# MongoDB 查询所有集合名
    MongoDB 错误be UuidLegacy, not UuidStandard
    jstree 反选,测试400条数据左右有点卡
    js Date对象日期格式化
    敏捷开发-Scrum
    linux centos7 和 windows下 部署 .net core 2.0 web应用
    部署SSL站点 IIS+asp.net
  • 原文地址:https://www.cnblogs.com/wdfrog/p/1234628.html
Copyright © 2011-2022 走看看