【问题标题】:Resize SubGrid Columns on resizing main grid调整主网格大小时调整子网格列的大小
【发布时间】:2012-12-22 08:56:24
【问题描述】:

我正在使用下面的示例代码来创建带有子网格的 jqGrid。

在我的例子中,我删除了 subGrids 的标题。所以,它看起来像一个分组。

在这里,每当我调整主网格列的大小时。我检查了 jqGrid 文档,发现返回列 ID 和新宽度的“resizeStop”。

但是,没有找到类似 setSize 的列。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>SubGrid Editable</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

<link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/themes/redmond/jquery-ui.css" />
<link rel="stylesheet" type="text/css" href="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.3.2/css/ui.jqgrid.css" />
<style>
    .groupColumn {
            background-color: #E3E3D7 !important;
            border: 1px solid #F4F4e5;
            font-weight: bold; !important;
    }
    .lockedColumn {
            background-color: #E3E3D7 !important;
            border: 1px solid #F4F4e5;
    }
    .ui-jqgrid .ui-subgrid td.subgrid-data {
        border-top: 0 none !important;
        border-right: 0 none !important;
        border-bottom: 0 none !important;
    }

</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.4.1/js/i18n/grid.locale-en.js"></script>
<script type="text/javascript">
    $.jgrid.no_legacy_api = true;
    $.jgrid.useJSON = true;
</script>
<script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.4.1/js/jquery.jqGrid.src.js"></script>

<script type="text/javascript">
//<![CDATA[
    /*global $ */
    /*jslint browser: true, eqeq: true, plusplus: true */
    $(function () {
        "use strict";
        var colModelData =[{"classes":"groupColumn","name":"itemName","editable":false, "width":"80"},{"width":"80","name":"24394","editable":true},{"width":"80","name":"24390","editable":true},{"width":"80","name":"24387","editable":true},{"width":"80","name":"24386","editable":true},{"width":"80","name":"24385","editable":true},{"width":"80","name":"24383","editable":true},{"width":"80","name":"24369","editable":true},{"width":"80","name":"24306","editable":true}],
            colNamesArray = ["Name","12/21/2012","12/10/2012","12/03/2012","11/27/2012","11/15/2012","11/12/2012","11/09/2012","10/15/2012"],
         editableRows = [0],

         myData = [{"id":"group1","itemName":"Goal Scored","subGridData":[{"id":0,"itemName":"Cristiano Ronaldo","24369":"2","24387":"1","24394":"3","24306":"0","24390":"0","24385":"4","24386":"2","24383":"1"}]},
         {"id":"group2","itemName":"Yellow Cards","subGridData":[{"id":0,"itemName":"Cristiano Ronaldo","24369":"0","24387":"1","24394":"2","24306":"0","24390":"0","24385":"2","24386":"0","24383":"0"}]}];

        $("#list").jqGrid({
            datatype: "local",
            data: myData,
            colNames: colNamesArray,
            colModel: colModelData,
            gridview: true,
            height: "100%",
            width: "100%",
            caption: "Create subgrid from local data",
            subGrid: true,
             subGridOptions: {
                    reloadOnExpand: false,
                    selectOnExpand: false
                },
            subGridRowExpanded: function (subgridDivId, parentRowId) {
                    var $subgrid = $("<table id='" + subgridDivId + "_t'></table>");
                    $subgrid.appendTo("#" + $.jgrid.jqID(subgridDivId));
                    var data = $(this).jqGrid("getLocalRow", parentRowId);
                    $subgrid.jqGrid({
                            datatype: "local",
                            data: $(this).jqGrid("getLocalRow", parentRowId).subGridData,
                            colModel:colModelData,
                            height: "100%",
                            autoencode: true,
                            gridview: true
                    });

            $subgrid.closest("div.ui-jqgrid-view")
                    .children("div.ui-jqgrid-hdiv").hide();
            }, gridComplete: function(){
                    $("#list").jqGrid("expandSubGridRow","group1");
            }   

        });

    });
//]]>
</script>

屏幕:

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:

    你的问题很有趣,但答案并不容易。尽管如此,我还是投入了一些时间,并为您提供了the following demo,它展示了您如何实施该解决方案。该实现基于对内部函数dragEndthe source code 的分析,该函数将在mouseup 回调内部调用(参见here)。列标题上的mousemove 回调(请参阅here)和mousedown(请参阅here)一起播放。

    结果the demo调整子网格的列大小:

    我在演示中包含了在调整列大小后调整整个网格大小的技巧。它最初在the answer 中进行了描述。我个人在每个生产网格中都使用它,因为我更喜欢没有滚动条的网格。

    下面我包含演示的完整代码(全部来自document.ready 处理程序):

    var myData = [
            {
                id: "10",
                c1: "My Value 1.1",
                c2: "My Value 1.2",
                c3: "My Value 1.3",
                c4: "My Value 1.4",
                subgridData: [
                    { id: "10", c1: "aa", c2: "ab", c3: "ac", c4: "ad" },
                    { id: "20", c1: "ba", c2: "bb", c3: "bc", c4: "bd" },
                    { id: "30", c1: "ca", c2: "cb", c3: "cc", c4: "cd" }
                ]
            },
            {
                id: "20",
                c1: "My Value 2.1",
                c2: "My Value 2.2",
                c3: "My Value 2.3",
                c4: "My Value 2.4",
                subgridData: [
                    { id: "10", c1: "da", c2: "db", c3: "dc", c4: "dd" },
                    { id: "20", c1: "ea", c2: "eb", c3: "ec", c4: "ed" },
                    { id: "30", c1: "fa", c2: "fb", c3: "fc", c4: "fd" }
                ]
            },
            {
                id: "30",
                c1: "My Value 3.1",
                c2: "My Value 3.2",
                c3: "My Value 3.3",
                c4: "My Value 3.4",
                subgridData: [
                    { id: "10", c1: "ga", c2: "gb", c3: "gc", c4: "gd" },
                    { id: "20", c1: "ha", c2: "hb", c3: "hc", c4: "hd" },
                    { id: "30", c1: "ia", c2: "ib", c3: "ic", c4: "id" }
                ]
            }
        ],
        mainGridPrefix = "s_";
    
    $("#list").jqGrid({
        datatype: "local",
        data: myData,
        colNames: ["Column 1", "Column 2", "Column 3", "Column 4"],
        colModel: [
            { name: "c1", width: 100 },
            { name: "c2", width: 130 },
            { name: "c3", width: 150 },
            { name: "c4", width: 170 }
        ],
        rowNum: 10,
        rowList: [5, 10, 20],
        pager: "#pager",
        gridview: true,
        ignoreCase: true,
        rownumbers: true,
        sortname: "c1",
        viewrecords: true,
        autoencode: true,
        height: "100%",
        idPrefix: mainGridPrefix,
        subGrid: true,
        subGridRowExpanded: function (subgridDivId, rowId) {
            var $subgrid = $("<table id='" + subgridDivId + "_t'></table>"),
                pureRowId = $.jgrid.stripPref(mainGridPrefix, rowId),
                colModel = $(this).jqGrid("getGridParam", "colModel");
    
            $subgrid.appendTo("#" + $.jgrid.jqID(subgridDivId));
            $subgrid.jqGrid({
                datatype: "local",
                data: $(this).jqGrid("getLocalRow", pureRowId).subgridData,
                colModel: [
                    { name: "c1", width: (colModel[2].width - 2) },
                    { name: "c2", width: colModel[3].width },
                    { name: "c3", width: colModel[4].width },
                    { name: "c2", width: (colModel[5].width - 2) }
                ],
                height: "100%",
                rowNum: 10000,
                autoencode: true,
                gridview: true,
                idPrefix: rowId + "_"
            });
            $subgrid.closest("div.ui-jqgrid-view")
                .children("div.ui-jqgrid-hdiv")
                .hide();
        },
        resizeStop: function (newWidth, index) {
            // grid.dragEnd()
            var widthChange = this.newWidth - this.width,
                $theGrid = $(this.bDiv).find(">div>.ui-jqgrid-btable"),
                $subgrids = $theGrid.find(">tbody>.ui-subgrid>.subgrid-data>.tablediv>.ui-jqgrid>.ui-jqgrid-view>.ui-jqgrid-bdiv>div>.ui-jqgrid-btable");
            $subgrids.each(function () {
                var grid = this.grid;
                // we have subgrids which have no internal subgrids
                // it reduce the number of columns to 1
                // we have rownumbers: true in the main grid, but not in subgrids
                // it reduce the number of columns to additional 1
                // so we should use (index - 2) as the column index in the subgrids
                grid.resizing = { idx: (index - 2) };
                grid.headers[index - 2].newWidth = (index - 2 === 0) || (index - 1 === grid.headers.length) ? newWidth - 2 : newWidth;
                grid.newWidth = grid.width + widthChange;
                grid.dragEnd.call(grid);
                $(this).jqGrid("setGridWidth", grid.newWidth, false);
            });
            $theGrid.jqGrid("setGridWidth", this.newWidth, false);
        }
    }).jqGrid("navGrid", "#pager", {add: false, edit: false, del: false});
    

    更新The answer 基于上述解决方案的代码引入了新的setColWidth 方法。一种使用新的setColWidth 方法来简化resizeStop 的代码。

    【讨论】:

    • 这太棒了。非常感谢您抽出宝贵时间。早些时候,我看到了您在调整列大小时调整网格大小的答案。但在这种情况下,棘手的部分是找到所有子网格及其第一列。你让我的周末愉快:)
    • 是否可以不根据列调整大小调整整个网格的大小?我想要像你的一个例子ok-soft-gmbh.com/jqGrid/SimpleLocalGridWithColumnChooser1.htm
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2012-06-24
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多