[原创] 给 ASP.NET 的 GridView 换炫酷外壳 —— GridView 整合 jquery easyui

近日给GridView套了个比较炫酷的skin,用 jquery easyui 里的 datagrid 美化了下显示效果,经过调试功能都已匹配。

原有GridView显示:

 

套用 jquery easyui 的 datagrid 后给效果如下,表格列宽可调整,分页功能可用,但分页依然是有刷,用url参数实现的,因为内核依然是 GridView,没有大改。

页面源代码:(基本是拖进来自动生成的标准GridView)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default7.aspx.cs" Inherits="Default7" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="X-UA-Compatible" content="IE=10" /> 
    <title>测试3!</title>
    <link rel="stylesheet" type="text/css" href="js/themes/default/easyui.css" />
    <link rel="stylesheet" type="text/css" href="js/themes/icon.css" />
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript" src="js/jquery.easyui.min.js"></script>
    <script type="text/javascript" src="js/locale/easyui-lang-zh_CN.js"></script>
    <script type="text/javascript" src="js/URLParser.js"></script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="ID" 
            DataSourceID="SqlDataSource1" EmptyDataText="没有可显示的数据记录。" 
            onprerender="GridView1_PreRender" onrowupdating="GridView1_RowUpdating">
            <Columns>
                <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
                <asp:BoundField DataField="ID" HeaderText="ID" ReadOnly="True" 
                    SortExpression="ID" />
                <asp:BoundField DataField="留言人" HeaderText="留言人" SortExpression="留言人" />
                <asp:BoundField DataField="留言人Email" HeaderText="留言人Email" 
                    SortExpression="留言人Email" />
                <asp:BoundField DataField="留言内容" HeaderText="留言内容" SortExpression="留言内容" />
                <asp:BoundField DataField="留言时间" HeaderText="留言时间" SortExpression="留言时间" />
                <asp:BoundField DataField="管理员回复内容" HeaderText="管理员回复内容" 
                    SortExpression="管理员回复内容" />
                <asp:BoundField DataField="管理员回复时间" HeaderText="管理员回复时间" 
                    SortExpression="管理员回复时间" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:LiuYanConnectionString1 %>" 
            DeleteCommand="DELETE FROM [T_留言板] WHERE [ID] = @ID" 
            InsertCommand="INSERT INTO [T_留言板] ([留言人], [留言人Email], [留言内容], [留言时间], [管理员回复内容], [管理员回复时间]) VALUES (@留言人, @留言人Email, @留言内容, @留言时间, @管理员回复内容, @管理员回复时间)" 
            ProviderName="<%$ ConnectionStrings:LiuYanConnectionString1.ProviderName %>" 
            SelectCommand="SELECT [ID], [留言人], [留言人Email], [留言内容], [留言时间], [管理员回复内容], [管理员回复时间] FROM [T_留言板]" 
            
            UpdateCommand="UPDATE [T_留言板] SET [留言人] = @留言人, [留言人Email] = @留言人Email, [留言内容] = @留言内容, [留言时间] = @留言时间, [管理员回复内容] = @管理员回复内容, [管理员回复时间] = @管理员回复时间 WHERE [ID] = @ID" 
            onselected="SqlDataSource1_Selected">
            <DeleteParameters>
                <asp:Parameter Name="ID" Type="Int32" />
            </DeleteParameters>
            <InsertParameters>
                <asp:Parameter Name="留言人" Type="String" />
                <asp:Parameter Name="留言人Email" Type="String" />
                <asp:Parameter Name="留言内容" Type="String" />
                <asp:Parameter Name="留言时间" Type="DateTime" />
                <asp:Parameter Name="管理员回复内容" Type="String" />
                <asp:Parameter Name="管理员回复时间" Type="DateTime" />
            </InsertParameters>
            <UpdateParameters>
                <asp:Parameter Name="留言人" Type="String" />
                <asp:Parameter Name="留言人Email" Type="String" />
                <asp:Parameter Name="留言内容" Type="String" />
                <asp:Parameter Name="留言时间" Type="DateTime" />
                <asp:Parameter Name="管理员回复内容" Type="String" />
                <asp:Parameter Name="管理员回复时间" Type="DateTime" />
                <asp:Parameter Name="ID" Type="Int32" />
            </UpdateParameters>
        </asp:SqlDataSource>
    
    </div>
    </form>
</body>
</html>

 

为了便于套用,主要代码都已经写成 2 个函数,在 GridView 及 SQLDataSource 的3个事件里调用即可。如果不启用 GridView 的编辑功能,则 GridView1_RowUpdating 事件里的代码可省略,这段代码是为了去除掉用 datagrid 显示后,更新时莫名其妙的会带着oldValue。其中 SqlDataSource1_Selected 事件里目的是取得记录总行数,datagrid 的分页需要这个参数来计算和统计分页。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default7 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void GridView1_PreRender(object sender, EventArgs e)
    {
        EasyUITools.datagridSkin(GridView1);
    }
    protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        EasyUITools.datagridSkinUpdate(e);
    }
    protected void SqlDataSource1_Selected(object sender, SqlDataSourceStatusEventArgs e)
    {
        GridView1.Attributes.Add("total", e.AffectedRows.ToString());
    }
}

 

其中<head>中载入的 URLParser.js 是用于解析 url 的 js 类,百度出来的,感谢原作者,代码如下:

/**
*@param {string} url 完整的URL地址
*@returns {object} 自定义的对象
*@description 用法示例:var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');

myURL.file='index.html'

myURL.hash= 'top'

myURL.host= 'abc.com'

myURL.query= '?id=255&m=hello'

myURL.params= Object = { id: 255, m: hello }

myURL.path= '/dir/index.html'

myURL.segments= Array = ['dir', 'index.html']

myURL.port= '8080'

yURL.protocol= 'http'

myURL.source= 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'

*/
function parseURL(url) {
 var a =  document.createElement('a');
 a.href = url;
 return {
 source: url,
 protocol: a.protocol.replace(':',''),
 host: a.hostname,
 port: a.port,
 query: a.search,
 params: (function(){
     var ret = {},
         seg = a.search.replace(/^\?/,'').split('&'),
         len = seg.length, i = 0, s;
     for (;i<len;i++) {
         if (!seg[i]) { continue; }
         s = seg[i].split('=');
         ret[s[0]] = s[1];
     }
     return ret;
 })(),
 file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1],
 hash: a.hash.replace('#',''),
 path: a.pathname.replace(/^([^\/])/,'/$1'),
 relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [,''])[1],
 segments: a.pathname.replace(/^\//,'').split('/')
 };
}


主要套用代码 EasyUITools.cs 如下:

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

/// <summary>
///EasyUITools 的摘要说明
/// </summary>
public class EasyUITools
{

    public static void datagridSkin(GridView gv)
    {
        datagridSkin(gv, null);
    }

    public static void datagridSkin(GridView gv, string sTitle)
    {
        if (gv.Rows.Count > 0)
        {
            string sDataOptions = "rownumbers:true,singleSelect:true";
            if (gv.AllowPaging)
            {
                int iPageNumber = 0;
                if (int.TryParse(gv.Page.Request.QueryString[gv.ID + "_pn"], out iPageNumber))
                    gv.PageIndex = iPageNumber - 1;
                int iPageSize = 10;
                if (int.TryParse(gv.Page.Request.QueryString[gv.ID + "_ps"], out iPageSize))
                    gv.PageSize = iPageSize;
                sDataOptions += ",pagination:true";
            }


            gv.CssClass = "easyui-datagrid";
            gv.Attributes.Add("data-options", sDataOptions);
            gv.Attributes.Add("dg-name", gv.ID);
            if (sTitle != null)
                gv.Attributes.Add("title", sTitle);
            gv.BorderWidth = 1;

            int i = 0;
            foreach (TableCell cell in gv.HeaderRow.Cells)
            {
                cell.Attributes.Add("data-options", "field:'item" + i.ToString() + "'");
                i++;
            }
            //使用<TH>替换<TD> 
            gv.UseAccessibleHeader = true;
            //HeaderRow将被<thead>包裹,数据行将被<tbody>包裹
            gv.HeaderRow.TableSection = TableRowSection.TableHeader;
            //FooterRow将被<tfoot>包裹
            //gv.FooterRow.TableSection = TableRowSection.TableFooter;

            if (gv.AllowPaging)
            {
                gv.BottomPagerRow.Visible = false;
                gv.Page.ClientScript.RegisterStartupScript(gv.Page.GetType(), "_dg_" + gv.ID, @"<script type=""text/javascript"">
$(function () {
    var dg = $(""[dg-name='" + gv.ID + @"']"");
    var pager = dg.datagrid().datagrid('getPager');
    var dgtotal = dg.attr('total');
    if (typeof (dgtotal) == 'undefined')
        alert('未设置GridView的total属性,请在SqlDataSource的Selected事件中或其他方式设置!');
    var currentUrl = parseURL(location.href);
    pager.pagination({
        showRefresh: false,
        total: dgtotal,
        pageNumber: currentUrl.params['" + gv.ID + @"_pn'],
        pageSize: currentUrl.params['" + gv.ID + @"_ps'],
        onSelectPage: function (pageNumber, pageSize) {
            $(""[dg-name='" + gv.ID + @"']"").datagrid().datagrid('getPager').pagination('loading');
            currentUrl.params['" + gv.ID + @"_pn'] = pageNumber;
            currentUrl.params['" + gv.ID + @"_ps'] = pageSize;
            var params = [];
            for (var key in currentUrl.params)
                params.push(key + '=' + currentUrl.params[key]);
            location = currentUrl.path + '?' + params.join('&');
            return false;
        }
    });
})
</script>");
            }
        }
    }
    public static void datagridSkinUpdate(GridViewUpdateEventArgs e)
    {
        // 清除莫名其妙多出的来的OldValue
        for (int i = 0; i < e.NewValues.Count; i++)
        {
            string oldValue = (string)e.OldValues[i];
            string newValue = (string)e.NewValues[i];
            if (oldValue == null || oldValue == "")
                e.NewValues[i] = newValue.Substring(0, newValue.Length - 1);
            else if (oldValue.Length < newValue.Length)
            {
                int iLength = newValue.Length - oldValue.Length;
                if (newValue.LastIndexOf(oldValue) == iLength)
                    e.NewValues[i] = newValue.Substring(0, iLength - 1);
            }
        }
    }

}

 

有兴趣的朋友可以到这里下载源码:

http://pan.baidu.com/s/1mg7epCG

转载于:https://www.cnblogs.com/Kelly123/p/3803177.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ASP.NET GridView控件可以通过数据绑定的方式来显示数据。数据绑定可以使用多种方式,如绑定数据源、绑定数据表、绑定数据集等。以下是一个简单的ASP.NET GridView绑定数据的示例: 1. 在ASP.NET页面中添加GridView控件,并设置其属性AutoGenerateColumns为True。 2. 在代码中获取数据源,可以使用ADO.NET、LINQ、Entity Framework等方式获取数据。 3. 将数据源绑定到GridView控件,可以使用以下代码: GridView1.DataSource = 数据源; GridView1.DataBind(); 4. 如果需要自定义GridView的列,可以在GridView的TemplateField中添加控件,如Label、TextBox等。 5. 最后,在页面中运行代码,即可看到GridView控件显示绑定的数据。 以上是ASP.NET GridView绑定数据的基本步骤,具体实现方式可以根据实际需求进行调整。 ### 回答2: ASP.NET GridView是一个重要的Web控件,它提供了一种灵活易用的方式来显示数据。网格视图可以用于在Web页面上显示有序数据列表,类似于表格。GridView使得在Web上交互数据变得简单。在asp.net网页中,在GridView中展示数据库信息是一项非常有用的技能。 网格视图是可以通过自增字段或外部数据源绑定进行填充的。其中,通过外部数据源绑定是一个更为常见和实际中更为有用的方法。通过外部数据源绑定,可以使GridView获取并显示其他数据源中的数据(如文件、数据库、Web服务等等)。 在ASP.NET中绑定数据到GridView控件的过程主要分为以下几步: 1. 配置数据源:打开Visual Studio,从“工具箱”中拖出一个GridView控件,然后在“Data”标签页中选择“Configure Data Source”以配置数据源。在其中选择采用的数据源类型,然后配置连接细节,以便GridView能够连接到需要显示的数据集或数据库。 2. 定义列:回到GridView控件设计器,定义需要在GridView中显示的列。可以使用自动化分析来填写在GridView组件表格中应该显示的列。 3. 绑定数据:将6处列与外部数据源关联就可以为GridView组件填充数据。在此过程中,需要指定数据绑定策略以及如何提取数据。 4. 实施密钥排序:通过单击Header处的特定列或者在“Data”标签中单击GridView控件的列名称进行排序。 GridViewASP.NET网站上提供了强大的数据列表功能。所以掌握如何使用数据绑定技术来展示数据库信息也是十分重要的。同时也需要了解GridView控件的许多属性,以便为应用程序添加适当的插入、删除和更新功能。 ### 回答3: ASP.NET GridView是一个常用的数据控件,它可以非常便捷地将数据绑定到网页上。在使用GridView控件绑定数据时,通常会有以下几个步骤: 1. 准备数据源:GridView所绑定的数据源可以是任意数据类型,包括数据表、数据集、数组、列表等。数据源需要提前准备好,并赋值给GridView控件的DataSource属性。 2. 定义列:GridView控件需要知道如何将数据显示在网页上,因此需要定义每列的显示方式和数据类型。可以通过GridView控件的Columns属性添加列,在列中指定字段名称、数据类型、显示格式等。 3. 绑定数据:当GridView控件的DataSource和Columns属性都准备好后,可以通过GridView控件的DataBind方法来绑定数据。在数据绑定的过程中,GridView控件会根据每列的定义自动将数据显示在网页上。 除了以上三个基本步骤,GridView控件还提供了一些高级功能,如分页、排序、编辑、删除等,可以通过相应的属性和方法来使用。 需要注意的是,在网页开发中,数据绑定是一个非常常见的操作,因此要充分了解各种数据绑定的方式和技巧,能够高效地完成网页的开发工作。同时,为了提高用户体验和性能,还需要注意缓存、分页和异步刷新等相关技术。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值