Ext4.2学习之GridPanel

<!DOCTYPE html>
<html>
<head>
    <title>Hello World</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link type="text/css" rel="stylesheet" href="ext-4/resources/css/ext-all.css"/>
    <!--定义样式文件-->
    <style type="text/css">
        .white-row {
            background-color: white;
        }

        .red-row {
            background-color: #F5C0C0 !important;
        }

        .yellow-row {
            background-color: #FBF8BF !important;
        }

        .green-row {
            background-color: #99CC99 !important;
        }

        .x-grid-row .x-grid-cell {
            background-color: transparent;
        }
    </style>
    <script type="text/javascript" src="ext-4/ext-all.js"></script>
    <script type="text/javascript" src="local/ext-lang-zh_CN.js"></script>
    <script>
        Ext.onReady(function () {

            function renderSex(value) {
                if (value == 'male') {
                    return "<span style='color:red;font-weight:bold;'>红男</span><img src='user_male.png' />";
                } else {
                    return "<span style='color:green;font-weight:bold;'>绿女</span><img src='user_female.png' />";
                }
            }

            function renderMotif(data, cell, record, rowIndex, columnIndex, store) {
                var value = record.get('color')
                cell.style = "background-color:" + value;
                return data;
            }

            /**
             * 渲染函数
             * @param value 将要显示在单元格中的值
             * @param cellmeta 单元格的相关属性,主要有id和CSS
             * @param record 当前行的数据对象 如果要获取列 record.data["id"]
             * @param rowIndex 行号
             * @param columnIndex 列号
             * @param store 构造表格用的ds
             */
            function renderDescn(value, cellmeta, record, rowIndex, columnIndex, store) {
                var str = "<input type='button' value='查看详细信息' οnclick='alert(\"" +
                    "这个单元格的值是:" + value + "\\n" +
                    "这个单元格的配置是:{cellId:" + cellmeta.cellId + ",id:" + cellmeta.id + ",css:" + cellmeta.css + "}\\n" +
                    "这个单元格对应行的record是:" + record + ",一行的数据都在里边\\n" +
                    "这是第" + rowIndex + "行\\n" +
                    "这是第" + columnIndex + "列\\n" +
                    "这个表格对应的Ext.data.Store在这里:" + store + ",随便用吧。" +
                    "\")'>";
                return str;
            }

            // 表格包含的列
            var columns = [
                // 显示行号
                new Ext.grid.RowNumberer(),
                // header 标题 width 宽度 sortable 当前列是否可排序
                {header: '编号', dataIndex: 'id', width: 200, sortable: true},
                {header: '名称', dataIndex: 'name', width: 200, sortable: false},
                // 通过renderer函数将male显示为红男 而其他为绿女
                {
                    header: '性别', dataIndex: 'sex', width: 200, sortable: false, renderer: function (value) {
                        if (value == 'male') {
                            return "<span style='color: red;font-weight: bold'>男</span><img src='icons/user_male.png'>";
                        } else {
                            return "<span style='color: green;font-weight: bold'>女</span><img src='icons/user_female.png'>";
                        }
                    }
                },
                {header: '描述', dataIndex: 'descn', width: 400, sortable: false, renderer: renderDescn},
                {header: '颜色', dataIndex: 'color', width: 400, sortable: false, renderer: renderMotif},
                {header: '日期', dataIndex: 'date', renderer: Ext.util.Format.dateRenderer('Y-m-d'), width: 400}
            ];

            var data = [
                ['1', 'name1', 'male', 'descn1', '#FBF8BF', '1970-01-15T02:58:04'],
                ['2', 'name2', 'female', 'descn2', '#99CC99', '1970-01-15T02:58:04'],
                ['3', 'name3', 'male', 'descn3', '#F5C0C0', '1970-01-15T02:58:04'],
                ['4', 'name4', 'female', 'descn4', '#FFFFFF', '1970-01-15T02:58:04'],
                ['5', 'name5', 'male', 'descn5', '#FFFFFF', '1970-01-15T02:58:04']
            ];
            /**
             * 数据存储对象store负责将原始数据(二维数组、JSON对象数组、XML文本等)转为Ext.data.Record类型对象
             * @type {Ext.data.ArrayStore}
             */
            var store = new Ext.data.ArrayStore({
                data: data,
                fields: [
                    {name: 'id'},
                    {name: 'name'},
                    {name: 'sex'},
                    {name: 'descn'},
                    {name: 'color', type: 'string'},
                    // 日期类型处理 Y是年 m是月 d是日期 H是小时 i是分钟 s是秒
                    {name: 'date', type: 'date', dateFormat: 'Y-m-dTH:i:s'}
                ],
                // 设置默认的排序规则
                sorters: [{property: "id", direction: "DESC"}]
            });
            store.load();

            var sm = new Ext.selection.CheckboxModel();
            // var sm = new Ext.selection.CheckboxModel({checkOnly: false});

            var grid = new Ext.grid.GridPanel({
                // 表格会自动根据columns中设置的width按比例分配 非常智能
                forceFit: true,
                autoHeight: true,
                // 读取数据时的遮罩和提示功能
                loadMask: true,
                // 表格斑马线效果
                stripeRows: false,
                // 指示Ext将表格渲染的位置
                renderTo: 'grid',
                // GridPanel表格必须包含列定义信息columns和表格的数据存储器store
                store: store,
                columns: columns,
                // 提供复选框的功能
                // selModel: sm,
                selModel: new Ext.selection.RowModel({singleSelect: true}),
                viewConfig: {
                    enableRowBody: true,
                    getRowClass: function (record, rowIndex, p, ds) {
                        var cls = 'white-row';
                        switch (record.data.color) {
                            case '#FBF8BF' :
                                cls = 'yellow-row'
                                break;
                            case '#99CC99' :
                                cls = 'green-row'
                                break;
                            case '#F5C0C0' :
                                cls = 'red-row'
                                break;
                        }
                        return cls;
                    }
                }
            });

            /**
             * 点击操作 显示数据
             */
            grid.on('itemclick', function () {
                var selected = grid.getSelectionModel().selected;
                for (var i = 0; i < selected.getCount(); i++) {
                    // 根据选择模型获取数据 如果选择模型为单元格 那么获取的为单元格数据 如果是行模型 则获取的是行数据
                    var record = selected.get(i);
                    Ext.Msg.alert('提示', record.get("id") + "," + record.get("name") + "," + record.get("descn"));
                }
            });

            Ext.get('remove').on('click', function () {
                // 删除第二行数据
                store.remove(store.getAt(1));
                // 执行视图刷新 并没有效果
                grid.view.refresh();
            });
        });
    </script>
</head>
<body>
<div id="grid"></div>
<input type="button" id="remove" value="删除第二行"/>
</body>
</html>

在这里插入图片描述
点击查看详细信息
在这里插入图片描述
点击某一行
在这里插入图片描述
添加分页和插入、删除

<!DOCTYPE html>
<html>
<head>
    <title>Hello World</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <link type="text/css" rel="stylesheet" href="ext-4/resources/css/ext-all.css"/>
    <!--定义样式文件-->
    <style type="text/css">
        .white-row {
            background-color: white;
        }

        .red-row {
            background-color: #F5C0C0 !important;
        }

        .yellow-row {
            background-color: #FBF8BF !important;
        }

        .green-row {
            background-color: #99CC99 !important;
        }

        .x-grid-row .x-grid-cell {
            background-color: transparent;
        }
    </style>
    <script type="text/javascript" src="ext-4/ext-all.js"></script>
    <script type="text/javascript" src="local/ext-lang-zh_CN.js"></script>
    <script>
        Ext.onReady(function () {

            function renderSex(value) {
                if (value == 'male') {
                    return "<span style='color:red;font-weight:bold;'>红男</span><img src='user_male.png' />";
                } else {
                    return "<span style='color:green;font-weight:bold;'>绿女</span><img src='user_female.png' />";
                }
            }

            function renderMotif(data, cell, record, rowIndex, columnIndex, store) {
                var value = record.get('color')
                cell.style = "background-color:" + value;
                return data;
            }

            /**
             * 渲染函数
             * @param value 将要显示在单元格中的值
             * @param cellmeta 单元格的相关属性,主要有id和CSS
             * @param record 当前行的数据对象 如果要获取列 record.data["id"]
             * @param rowIndex 行号
             * @param columnIndex 列号
             * @param store 构造表格用的ds
             */
            function renderDescn(value, cellmeta, record, rowIndex, columnIndex, store) {
                var str = "<input type='button' value='查看详细信息' οnclick='alert(\"" +
                    "这个单元格的值是:" + value + "\\n" +
                    "这个单元格的配置是:{cellId:" + cellmeta.cellId + ",id:" + cellmeta.id + ",css:" + cellmeta.css + "}\\n" +
                    "这个单元格对应行的record是:" + record + ",一行的数据都在里边\\n" +
                    "这是第" + rowIndex + "行\\n" +
                    "这是第" + columnIndex + "列\\n" +
                    "这个表格对应的Ext.data.Store在这里:" + store + ",随便用吧。" +
                    "\")'>";
                return str;
            }

            // 表格包含的列
            var columns = [
                // 显示行号
                new Ext.grid.RowNumberer(),
                // header 标题 width 宽度 sortable 当前列是否可排序
                {header: '编号', dataIndex: 'id', width: 200, sortable: true, editor: {allowBlank: false}},
                {header: '名称', dataIndex: 'name', width: 200, sortable: false},
                // 通过renderer函数将male显示为红男 而其他为绿女
                {
                    header: '性别', dataIndex: 'sex', width: 200, sortable: false, renderer: function (value) {
                        if (value == 'male') {
                            return "<span style='color: red;font-weight: bold'>男</span><img src='icons/user_male.png'>";
                        } else {
                            return "<span style='color: green;font-weight: bold'>女</span><img src='icons/user_female.png'>";
                        }
                    }
                },
                {header: '描述', dataIndex: 'descn', width: 400, sortable: false, renderer: renderDescn},
                {header: '颜色', dataIndex: 'color', width: 400, sortable: false, renderer: renderMotif},
                {header: '日期', dataIndex: 'date', renderer: Ext.util.Format.dateRenderer('Y-m-d'), width: 400}
            ];

            var data = [
                ['1', 'name1', 'male', 'descn1', '#FBF8BF', '1970-01-15T02:58:04'],
                ['2', 'name2', 'female', 'descn2', '#99CC99', '1970-01-15T02:58:04'],
                ['3', 'name3', 'male', 'descn3', '#F5C0C0', '1970-01-15T02:58:04'],
                ['4', 'name4', 'female', 'descn4', '#FFFFFF', '1970-01-15T02:58:04'],
                ['5', 'name5', 'male', 'descn5', '#FFFFFF', '1970-01-15T02:58:04']
            ];
            /**
             * 数据存储对象store负责将原始数据(二维数组、JSON对象数组、XML文本等)转为Ext.data.Record类型对象
             * @type {Ext.data.ArrayStore}
             */
            var store = new Ext.data.ArrayStore({
                data: data,
                fields: [
                    {name: 'id'},
                    {name: 'name'},
                    {name: 'sex'},
                    {name: 'descn'},
                    {name: 'color', type: 'string'},
                    // 日期类型处理 Y是年 m是月 d是日期 H是小时 i是分钟 s是秒
                    {name: 'date', type: 'date', dateFormat: 'Y-m-dTH:i:s'}
                ],
                // 设置默认的排序规则
                sorters: [{property: "id", direction: "DESC"}]
            });
            store.load();

            var sm = new Ext.selection.CheckboxModel();
            // var sm = new Ext.selection.CheckboxModel({checkOnly: false});

            var grid = new Ext.grid.GridPanel({
                // 表格会自动根据columns中设置的width按比例分配 非常智能
                forceFit: true,
                autoHeight: true,
                // 读取数据时的遮罩和提示功能
                loadMask: true,
                // 表格斑马线效果
                stripeRows: false,
                // 指示Ext将表格渲染的位置
                renderTo: 'grid',
                // GridPanel表格必须包含列定义信息columns和表格的数据存储器store
                store: store,
                columns: columns,
                // 提供复选框的功能
                // selModel: sm,
                // selModel: new Ext.selection.RowModel({singleSelect: true}),
                // 编辑单元 必须在columns中包含有editor属性
                selType: 'cellmodel',
                plugins: [
                    Ext.create('Ext.grid.plugin.CellEditing', {
                        clicksToEdit: 1
                    })
                ],
                // Ext.grid.GridView
                viewConfig: {
                    columnsText: '显示的列',
                    scrollOffset: 30,
                    sortAscText: '升序',
                    sortDescText: '升序',
                    // 自动填满
                    forceFit: true,
                    enableRowBody: true,
                    getRowClass: function (record, rowIndex, p, ds) {
                        var cls = 'white-row';
                        switch (record.data.color) {
                            case '#FBF8BF' :
                                cls = 'yellow-row'
                                break;
                            case '#99CC99' :
                                cls = 'green-row'
                                break;
                            case '#F5C0C0' :
                                cls = 'red-row'
                                break;
                        }
                        return cls;
                    }
                },
                // 添加底部行 显示分页信息
                bbar: new Ext.PagingToolbar({
                    // 指定bbar的样式
                    cls: 'rightPage',
                    pageSize: 10,
                    store: store,
                    displayInfo: true,
                    // 显示信息 只有当displayInfo设置为true的时候才会显示
                    displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
                    // 没有数据时显示的信息
                    emptyMsg: "没有记录"
                }),
                tbar: ['-', {
                    text: '添加一行',
                    handler: function () {
                        var p = {
                            id: '',
                            name: '',
                            sex: '',
                            descn: '',
                            color: '#FBF8BF',
                            date: '1970-01-15T02:58:04'
                        };
                        //grid.stopEditing();
                        store.insert(0, p);
                        //grid.startEditing(0, 0);
                    }
                }, '-', {
                    text: '删除一行',
                    handler: function () {
                        Ext.Msg.confirm('信息', '确定要删除?', function (btn) {
                            if (btn == 'yes') {
                                // 获得表格的选择模型
                                var sm = grid.getSelectionModel();
                                // 从选择模型中获得选中的单元格 对应的单元格有两个属性 一个是行号 一个是列号 此处通过行号获取记录
                                var record = sm.getSelection()[0];
                                store.remove(record);
                            }
                        });
                    }
                }, '-']
            });

            /**
             * 点击操作 显示数据
             */
            // grid.on('itemclick', function () {
            //     var selected = grid.getSelectionModel().selected;
            //     for (var i = 0; i < selected.getCount(); i++) {
            //         // 根据选择模型获取数据 如果选择模型为单元格 那么获取的为单元格数据 如果是行模型 则获取的是行数据
            //         var record = selected.get(i);
            //         Ext.Msg.alert('提示', record.get("id") + "," + record.get("name") + "," + record.get("descn"));
            //     }
            // });

            Ext.get('remove').on('click', function () {
                // 删除第二行数据
                store.remove(store.getAt(1));
                // 执行视图刷新 并没有效果
                grid.view.refresh();
            });
        });
    </script>
    <style type="text/css">
        .rightPage {
            float: right;
            width: 400px;
        }
    </style>
</head>
<body>
<div id="grid"></div>
<input type="button" id="remove" value="删除第二行"/>
</body>
</html>

在这里插入图片描述
加入数据类型组件,比如NumberField限制只能输入数字,ComboBox限制只能输入备选项,DateField限制只能选择日期,Checkbox则限制从true和false中选择其一。

           var comboData = [
                [0,'新版ext教程'],
                [1,'ext在线支持'],
                [2,'ext扩展']
            ];

            // 表格包含的列
            var columns = [
                // 显示行号
                new Ext.grid.RowNumberer(),
                // header 标题 width 宽度 sortable 当前列是否可排序
                {header: '编号', dataIndex: 'id', width: 100, sortable: true, editor: {allowBlank: false}},
                {header: '名称', dataIndex: 'name', width: 100, sortable: false},
                // 通过renderer函数将male显示为红男 而其他为绿女
                {
                    header: '性别', dataIndex: 'sex', width: 100, sortable: false, renderer: function (value) {
                        if (value == 'male') {
                            return "<span style='color: red;font-weight: bold'>男</span><img src='icons/user_male.png'>";
                        } else {
                            return "<span style='color: green;font-weight: bold'>女</span><img src='icons/user_female.png'>";
                        }
                    }
                },
                {header: '描述', dataIndex: 'descn', width: 100, sortable: false, renderer: renderDescn},
                {header: '颜色', dataIndex: 'color', width: 100, sortable: false, renderer: renderMotif},
                // {header: '日期', dataIndex: 'date', renderer: Ext.util.Format.dateRenderer('Y-m-d'), width: 400}
                {
                    header:'日期',
                    dataIndex:'date',
                    // 日期控件
                    editor:new Ext.form.DateField({
                        // 日期格式
                        format: 'Y-m-d',
                        minValue: '2007-12-14',
                        // 禁止用户选择星期几
                        disabledDays: [0, 6],
                        disabledDaysText: '只能选择工作日'
                    }),
                    renderer: function(value) {
                        return Ext.Date.format(value, "Y-m-d");
                    }
                },{
                    header:'判断列',
                    dataIndex:'check',
                    // checkbox只能选择true or false
                    editor:new Ext.form.Checkbox({
                        allowBlank: false
                    }),
                    renderer:function(value) {
                        return value ? '是' : '否';
                    }
                },
                {
                    header:'数字列',
                    dataIndex:'number',
                    editor:new Ext.form.NumberField({
                        allowBlank: false,
                        allowNegative: false,
                        maxValue: 10
                    })
                },{
                    header:'选择列',
                    dataIndex:'combo',
                    //
                    editor:new Ext.form.ComboBox({
                        store: new Ext.data.SimpleStore({
                            fields:['value','text'],
                            data: comboData
                        }),
                        emptyText: '请选择',
                        mode: 'local',
                        triggerAction: 'all',
                        valueField: 'value',
                        displayField: 'text',
                        // 不能通过readonly来设置只读属性 否则会造成无法正常显示 需要将editable设置为false
                        editable: false
                    }),
                    // 必须设置renderer否则显示的数据时value值 而不是text 毕竟编辑器只是在实际编辑时起作用 表格与editor之间共享的是数据 显示层要依靠各自的实现
                    renderer: function(value){
                        return comboData[value][1];
                    }
                }
            ];

            var data = [
                ['1', 'name1', 'male', 'descn1', '#FBF8BF', '2021-03-18T02:58:04',true,1.1,0],
                ['2', 'name2', 'female', 'descn2', '#99CC99', '2021-03-17T02:58:04',false,2.2,1],
                ['3', 'name3', 'male', 'descn3', '#F5C0C0', '2021-03-16T02:58:04',false,0.6,2],
                ['4', 'name4', 'female', 'descn4', '#FFFFFF', '2021-03-15T02:58:04',true,3.5,1],
                ['5', 'name5', 'male', 'descn5', '#FFFFFF', '2021-03-12T02:58:04',true,2,2]
            ];
            /**
             * 数据存储对象store负责将原始数据(二维数组、JSON对象数组、XML文本等)转为Ext.data.Record类型对象
             * @type {Ext.data.ArrayStore}
             */
            var store = new Ext.data.ArrayStore({
                data: data,
                fields: [
                    {name: 'id'},
                    {name: 'name'},
                    {name: 'sex'},
                    {name: 'descn'},
                    {name: 'color', type: 'string'},
                    // 日期类型处理 Y是年 m是月 d是日期 H是小时 i是分钟 s是秒
                    {name: 'date', type: 'date', dateFormat: 'Y-m-dTH:i:s'},
                    {name: 'check'},
                    {name: 'number'},
                    {name: 'combo'}
                ],
                // 设置默认的排序规则
                sorters: [{property: "id", direction: "DESC"}]
            });

在这里插入图片描述
在这里插入图片描述
添加属性表格控件PropertyGrid

            var propertygrid = new Ext.grid.PropertyGrid({
                title: '属性表格',
                autoHeight: true,
                width: 300,
                renderTo: 'propertygrid',
                viewConfig: {
                    forceFit: true
                },
                // string、date、bool和number都对应默认的编辑器
                source: {
                    "名字": "不告诉你",
                    "创建时间": new Date(Date.parse('12/15/2007')),
                    "是否有效": false,
                    "版本号": .01,
                    "描述": "嗯,估计没啥可说的"
                }
            });

            // PropertyGrid默认是提供编辑功能的 使用以下的方法禁用这个编辑功能
            propertygrid.on("beforeedit",function(e){
                e.cancel = true;
                return false;
            });

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lang20150928

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值