【问题标题】:Add numeric pager to jqGrid将数字寻呼机添加到 jqGrid
【发布时间】:2011-04-27 06:43:24
【问题描述】:

有人知道设置 jqGrid 以使用数字寻呼机的方法吗?

而不是第 1 页,共 20 页,我想让分页像 1,2,3,4 > >> 当我点击 4 时,它会像 > >

我已经看到其他网格如何做到这一点,但我似乎无法找到 jqGrid 的内置方式来做到这一点。 我可能有办法实现它,但如果已经有东西了,我不想重新发明轮子。这将涉及我在从网格数据中获取用户数据以确定可用页面后添加自定义按钮。

Telerik 的网格可以做到这一点 (http://demos.telerik.com/aspnet-mvc/grid)。

【问题讨论】:

  • 当您发现时,请通知我们,以便我们也有更新。

标签: jquery jqgrid


【解决方案1】:

哦!在我编写代码期间,firegnom 发布了另一个实现。不过最好有两个工作版本,因为没有一个。

我做了一个小演示,演示了如何实现寻呼机中的链接行为。我制作了这样的代码,它可以在表单中显示寻呼机

(如果使用了jqGrid的pginput: false参数)或者形式

在这两种情况下,当前页面都不会显示在列表中。如何看到我为链接插入了带下划线的样式。如果你不喜欢它,你应该删除

td.myPager a { text-decoration:underline !important }

来自演示。您可以看到herehere 的工作现场演示。

对应的JavaScript代码在loadComplete事件处理函数内部是完整的:

loadComplete: function() {
    var i, myPageRefresh = function(e) {
        var newPage = $(e.target).text();
        grid.trigger("reloadGrid",[{page:newPage}]);
        e.preventDefault();
    };

    $(grid[0].p.pager + '_center td.myPager').remove();
    var pagerPrevTD = $('<td>', { class: "myPager"}), prevPagesIncluded = 0,
        pagerNextTD = $('<td>', { class: "myPager"}), nextPagesIncluded = 0,
        totalStyle = grid[0].p.pginput === false,
        startIndex = totalStyle? this.p.page-MAX_PAGERS*2: this.p.page-MAX_PAGERS;
    for (i=startIndex; i<=this.p.lastpage && (totalStyle? (prevPagesIncluded+nextPagesIncluded<MAX_PAGERS*2):(nextPagesIncluded<MAX_PAGERS)); i++) {
        if (i<=0 || i === this.p.page) { continue; }

        var link = $('<a>', { href:'#', click:myPageRefresh });
        link.text(String(i));
        if (i<this.p.page || totalStyle) {
            if (prevPagesIncluded>0) { pagerPrevTD.append('<span>,&nbsp;</span>'); }
            pagerPrevTD.append(link);
            prevPagesIncluded++;
        } else {
            if (nextPagesIncluded>0 || (totalStyle && prevPagesIncluded>0)) { pagerNextTD.append('<span>,&nbsp;</span>'); }
            pagerNextTD.append(link);
            nextPagesIncluded++;
        }
    }
    if (prevPagesIncluded > 0) {
        $(grid[0].p.pager + '_center td[id^="prev"]').after(pagerPrevTD);
    }
    if (nextPagesIncluded > 0) {
        $(grid[0].p.pager + '_center td[id^="next"]').before(pagerNextTD);
    }
}

其中gridMAX_PAGERS 定义为

var grid = $("#list"), MAX_PAGERS = 2;

【讨论】:

  • 干得好。进行了一些调整以使其正常工作,但这很好用。这将是 4.1 的一个很酷的内置功能
  • @HapiDjus:我发现解决方案还不完美。我不知道在新外观中显示当前页面和总页数的最佳方式是哪种。关于 jqGrid 新版本中包含的功能。我不是 jqGrid 的开发人员,所以我必须影响在 jqGrid 的新版本中包含新功能。如果我们找到了显示当前页面和我可以在 trirand 论坛中使用我的代码发布功能请求的页面总数的真正好方法,那么该功能可能可能包含在下一个 jqGrid 版本中,但您现在可以使用loadComplete 中的代码。
  • @HapiDjus:再提一句。我看到你任何时候都不使用“投票”。从 15 点声望开始,你有权利。 Here 您可以找到简单的规则:“当您看到问题的新答案时,请点击答案左侧的向上箭头,为有帮助的答案投票。”“接受”并且未投票的问题在许多方面将被解释为“关闭”,并将被搜索引擎放置在最后一个位置,因为答案被解释为没有帮助。我想你应该知道这一点。
  • @Oleg:很好,有时可能有用。谢谢
  • 谢谢!这对我编写自己的自定义分页实现有很大帮助。
【解决方案2】:

据我所知,在 jquery 中没有解决方案,你必须自己做。下面我有寻呼机的工作代码:

function jqgridCreatePager(pagernav,navgrid,pages){
    $('#'+pagernav+' #'+pagernav+'_center td:has(input)').attr('id','pager');
    var td = $('#'+pagernav+' #'+pagernav+'_center #pager').html('');
    var page = parseInt(jQuery("#"+navgrid).jqGrid('getGridParam','page'))
    var lastPage = parseInt(jQuery("#"+navgrid).jqGrid('getGridParam','lastpage'))
    text='';
    if(page-pages > 1){
            text+=jqgridCreatePageLink(navgrid,1)
            text+= ' ... '
    }
    for(var i=0;i <pages;i++){
        if(page-pages+i >=1)
            text+=jqgridCreatePageLink(navgrid,page-pages+i)
    }

    text +=jqgridCreatePageLink(navgrid,page,true);

    for(var i=0;i <pages;i++){
        if(page+i+1 <= lastPage) 
            text +=jqgridCreatePageLink(navgrid,page+i+1)
    }

    if(page+pages <= lastPage){
        text+= ' ... '
        text+=jqgridCreatePageLink(navgrid,lastPage)

    }
    var td = $('#'+pagernav+' #'+pagernav+'_center #pager').html(text);
}

和正在建立链接的函数

function jqgridCreatePageLink(navgrid,page,current){
    if (!current)
        return ' <a href="#" onclick="jQuery(\'#'+navgrid+'\').jqGrid(\'setGridParam\',{page:'+page+'}).trigger(\'reloadGrid\')">'+page+'</a> ';
    return ' >'+page+'< '
}

现在要将此代码与网格集成,只需在创建网格时添加它 gridComplete 事件或类似的东西:

//create 
jqgridCreatePager('yourGridNavigator','yourGrid',3)

并将其附加到 onPage 事件

//onPage
jqgridCreatePager('yourGridNavigator','yourGrid',3)

为了防止闪烁只需添加到您的 CSS

#yourGridNavigator_center{
 display:none;
}

再次在 gridComplete 上添加

$('#yourGridNavigator_center').show();

关于功能参数:

  • 首先是您的网格导航器 ID
  • second 是您的网格 ID
  • 函数的第三个参数是当前页前后应该显示多少页

【讨论】:

  • 这两种解决方案虽然以不同的方式工作。我不相信有一个 onPage 事件(可能是 onPaging),但它可以在没有调用的情况下工作。
【解决方案3】:

还有一种可能的解决方案。

它将分页文本框替换为链接列表。

loadComplete: function() {
    var grid = this;
    var container = jQuery("#prev_jqGridTablePager").next().next();
    jQuery(container).html('');

    var totalPages = grid.p.lastpage;
    for (var i = 1; i <= totalPages; i++) {
        if (i == grid.p.page) {
            jQuery(container).append("<span class='pagination current'>" + i + "</span>");
        } else {
            jQuery(container).append("<a class='pagination' href='javascript: void(0)'>" + i + "</a>");
        }
    }

    jQuery(container).find("a.pagination").click(function(e) {
        e.preventDefault();

        var newPage = jQuery(this).text();
        jQuery(grid).trigger("reloadGrid", [{ page: newPage }]);
    });
}

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多