extjs学习札记(六-3) grid中数据的保存,添加和删除

extjs学习笔记(六--3) grid中数据的保存,添加和删除

 我们先通过grid的getSelectionModel方法获得当前的选择模型,由于当前我们使用了行选择模型,所以返回的是RowSelectionModel的对象,然后通过该对象的hasSelection方法判断有没有行呗选中,没有的话就弹出一个对话框,如果有选中的行要被删除,弹出一个提示框让用户确定删除操作,如果确实要删除,使用RowSelectionModel对象的getSelections方法返回所有被选择行的集合,遍历此集合,从store中去掉集合中的行。看看效果图:

extjs学习札记(六-3) grid中数据的保存,添加和删除 

     点击“是”,所有选中的行被删除,通过firebug可以看到被删除的行在store的removed属性中保存。

    但是有些人可能不习惯这里所谓的行选择模型,他们可能喜欢看到在每一行的前边有一个checkbox,勾选了之后表示选择该行,extjs中的CheckboxSelectionModel类可以方便的让我们实现这一点,该类继承自RowSelectionModel,说明这只是一种特殊的行选择模型。我们具体来看看怎么进行操作。首先需要定义一个CheckboxSelectionModel的对象:var sm=new Ext.grid.CheckboxSelctionModle({checkOnly:true}),这里chckOnly:true表明只能通过checkbox来选择行,为false的话则还可以通过我们上边提到的方法来选择行。接下来需要把原来的行选择模型替换成我们新的sm,然后运行一下看看吧。我们没有看到预期中的效果,这是为什么呢?仔细想一想,确实应该是看不到什么效果,我们知道列都是在ColumnModel里边配置的,我们的CheckboxSelectionModel需要添加一列,自然也要在其中配置。那我们就加上去吧,完整的代码如下:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->  1extjs学习札记(六-3) grid中数据的保存,添加和删除///<reference path="vswd-ext_2.0.2.js" />
  2extjs学习札记(六-3) grid中数据的保存,添加和删除/*
  3extjs学习札记(六-3) grid中数据的保存,添加和删除*作者:大笨
  4extjs学习札记(六-3) grid中数据的保存,添加和删除*日期:2009-10-20
  5extjs学习札记(六-3) grid中数据的保存,添加和删除*版本:1.0
  6extjs学习札记(六-3) grid中数据的保存,添加和删除*博客地址:http://yage.cnblogs.com
  7extjs学习札记(六-3) grid中数据的保存,添加和删除*QQ:14202190
  8extjs学习札记(六-3) grid中数据的保存,添加和删除*/
  9extjs学习札记(六-3) grid中数据的保存,添加和删除Ext.BLANK_IMAGE_URL = '../extjs/resources/images/default/s.gif';
 10extjs学习札记(六-3) grid中数据的保存,添加和删除
 11extjs学习札记(六-3) grid中数据的保存,添加和删除Ext.onReady(function() {
 12extjs学习札记(六-3) grid中数据的保存,添加和删除    Ext.QuickTips.init();
 13extjs学习札记(六-3) grid中数据的保存,添加和删除
 14extjs学习札记(六-3) grid中数据的保存,添加和删除    //格式化日期
 15extjs学习札记(六-3) grid中数据的保存,添加和删除    function formatDate(value) {
 16extjs学习札记(六-3) grid中数据的保存,添加和删除        return value ? value.dateFormat('Y年m月d日') : '';
 17extjs学习札记(六-3) grid中数据的保存,添加和删除    }
 18extjs学习札记(六-3) grid中数据的保存,添加和删除
 19extjs学习札记(六-3) grid中数据的保存,添加和删除    // 别名
 20extjs学习札记(六-3) grid中数据的保存,添加和删除    var fm = Ext.form;
 21extjs学习札记(六-3) grid中数据的保存,添加和删除
 22extjs学习札记(六-3) grid中数据的保存,添加和删除    //checkbox选择模型
 23extjs学习札记(六-3) grid中数据的保存,添加和删除    var sm = new Ext.grid.CheckboxSelectionModel({ checkOnly: true });
 24extjs学习札记(六-3) grid中数据的保存,添加和删除    
 25extjs学习札记(六-3) grid中数据的保存,添加和删除    //构造一个只能包含checkbox的列
 26extjs学习札记(六-3) grid中数据的保存,添加和删除    var checkColumn = new Ext.grid.CheckColumn({
 27extjs学习札记(六-3) grid中数据的保存,添加和删除        header: 'Indoor?',
 28extjs学习札记(六-3) grid中数据的保存,添加和删除        dataIndex: 'indoor',
 29extjs学习札记(六-3) grid中数据的保存,添加和删除        width: 55
 30extjs学习札记(六-3) grid中数据的保存,添加和删除    });
 31extjs学习札记(六-3) grid中数据的保存,添加和删除
 32extjs学习札记(六-3) grid中数据的保存,添加和删除    // 构造ColumnModel
 33extjs学习札记(六-3) grid中数据的保存,添加和删除    var cm = new Ext.grid.ColumnModel({
 34extjs学习札记(六-3) grid中数据的保存,添加和删除    columns: [
 35extjs学习札记(六-3) grid中数据的保存,添加和删除        sm,
 36extjs学习札记(六-3) grid中数据的保存,添加和删除        {
 37extjs学习札记(六-3) grid中数据的保存,添加和删除            id: 'common',
 38extjs学习札记(六-3) grid中数据的保存,添加和删除            header: 'Common Name',
 39extjs学习札记(六-3) grid中数据的保存,添加和删除            dataIndex: 'common',
 40extjs学习札记(六-3) grid中数据的保存,添加和删除            width: 220,
 41extjs学习札记(六-3) grid中数据的保存,添加和删除            // 使用上边定义好的别名
 42extjs学习札记(六-3) grid中数据的保存,添加和删除            editor: new fm.TextField({
 43extjs学习札记(六-3) grid中数据的保存,添加和删除                allowBlank: false
 44extjs学习札记(六-3) grid中数据的保存,添加和删除            })
 45extjs学习札记(六-3) grid中数据的保存,添加和删除        }, {
 46extjs学习札记(六-3) grid中数据的保存,添加和删除            header: 'Light',
 47extjs学习札记(六-3) grid中数据的保存,添加和删除            dataIndex: 'light',
 48extjs学习札记(六-3) grid中数据的保存,添加和删除            width: 130,
 49extjs学习札记(六-3) grid中数据的保存,添加和删除            editor: new fm.ComboBox({
 50extjs学习札记(六-3) grid中数据的保存,添加和删除                typeAhead: true,
 51extjs学习札记(六-3) grid中数据的保存,添加和删除                triggerAction: 'all',
 52extjs学习札记(六-3) grid中数据的保存,添加和删除                transform: 'light',
 53extjs学习札记(六-3) grid中数据的保存,添加和删除                lazyRender: true,
 54extjs学习札记(六-3) grid中数据的保存,添加和删除                listClass: 'x-combo-list-small'
 55extjs学习札记(六-3) grid中数据的保存,添加和删除            })
 56extjs学习札记(六-3) grid中数据的保存,添加和删除        }, {
 57extjs学习札记(六-3) grid中数据的保存,添加和删除            header: 'Price',
 58extjs学习札记(六-3) grid中数据的保存,添加和删除            dataIndex: 'price',
 59extjs学习札记(六-3) grid中数据的保存,添加和删除            width: 70,
 60extjs学习札记(六-3) grid中数据的保存,添加和删除            align: 'right',
 61extjs学习札记(六-3) grid中数据的保存,添加和删除            renderer: 'usMoney',
 62extjs学习札记(六-3) grid中数据的保存,添加和删除            editor: new fm.NumberField({
 63extjs学习札记(六-3) grid中数据的保存,添加和删除                allowBlank: false,
 64extjs学习札记(六-3) grid中数据的保存,添加和删除                allowNegative: false,
 65extjs学习札记(六-3) grid中数据的保存,添加和删除                maxValue: 100000
 66extjs学习札记(六-3) grid中数据的保存,添加和删除            })
 67extjs学习札记(六-3) grid中数据的保存,添加和删除        }, {
 68extjs学习札记(六-3) grid中数据的保存,添加和删除            header: 'Available',
 69extjs学习札记(六-3) grid中数据的保存,添加和删除            dataIndex: 'availDate',
 70extjs学习札记(六-3) grid中数据的保存,添加和删除            width: 95,
 71extjs学习札记(六-3) grid中数据的保存,添加和删除            renderer: formatDate,
 72extjs学习札记(六-3) grid中数据的保存,添加和删除            editor: new fm.DateField({
 73extjs学习札记(六-3) grid中数据的保存,添加和删除                format: 'Y年m月d日',
 74extjs学习札记(六-3) grid中数据的保存,添加和删除                minValue: '01/01/06',
 75extjs学习札记(六-3) grid中数据的保存,添加和删除                disabledDays: [0, 6],
 76extjs学习札记(六-3) grid中数据的保存,添加和删除                disabledDaysText: 'Plants are not available on the weekends'
 77extjs学习札记(六-3) grid中数据的保存,添加和删除            })
 78extjs学习札记(六-3) grid中数据的保存,添加和删除        },
 79extjs学习札记(六-3) grid中数据的保存,添加和删除        checkColumn,
 80extjs学习札记(六-3) grid中数据的保存,添加和删除    ],
 81extjs学习札记(六-3) grid中数据的保存,添加和删除        defaults: {
 82extjs学习札记(六-3) grid中数据的保存,添加和删除            sortable: true
 83extjs学习札记(六-3) grid中数据的保存,添加和删除        }
 84extjs学习札记(六-3) grid中数据的保存,添加和删除    });
 85extjs学习札记(六-3) grid中数据的保存,添加和删除
 86extjs学习札记(六-3) grid中数据的保存,添加和删除
 87extjs学习札记(六-3) grid中数据的保存,添加和删除    // 构造一个Store对象
 88extjs学习札记(六-3) grid中数据的保存,添加和删除    var store = new Ext.data.Store({
 89extjs学习札记(六-3) grid中数据的保存,添加和删除
 90extjs学习札记(六-3) grid中数据的保存,添加和删除        url: 'plants.xml',
 91extjs学习札记(六-3) grid中数据的保存,添加和删除
 92extjs学习札记(六-3) grid中数据的保存,添加和删除        reader: new Ext.data.XmlReader(
 93extjs学习札记(六-3) grid中数据的保存,添加和删除            {
 94extjs学习札记(六-3) grid中数据的保存,添加和删除                record: 'plant'
 95extjs学习札记(六-3) grid中数据的保存,添加和删除            },
 96extjs学习札记(六-3) grid中数据的保存,添加和删除
 97extjs学习札记(六-3) grid中数据的保存,添加和删除            [
 98extjs学习札记(六-3) grid中数据的保存,添加和删除                { name: 'common', type: 'string' },
 99extjs学习札记(六-3) grid中数据的保存,添加和删除                { name: 'botanical', type: 'string' },
100extjs学习札记(六-3) grid中数据的保存,添加和删除                { name: 'light' },
101extjs学习札记(六-3) grid中数据的保存,添加和删除                { name: 'price', type: 'float' },
102extjs学习札记(六-3) grid中数据的保存,添加和删除                { name: 'availDate', mapping: 'availability', type: 'date', dateFormat: 'm/d/Y' },
103extjs学习札记(六-3) grid中数据的保存,添加和删除                { name: 'indoor', type: 'bool' }
104extjs学习札记(六-3) grid中数据的保存,添加和删除            ]
105extjs学习札记(六-3) grid中数据的保存,添加和删除        ),
106extjs学习札记(六-3) grid中数据的保存,添加和删除        sortInfo: { field: 'common', direction: 'ASC' }
107extjs学习札记(六-3) grid中数据的保存,添加和删除    });
108extjs学习札记(六-3) grid中数据的保存,添加和删除
109extjs学习札记(六-3) grid中数据的保存,添加和删除    // 构造可编辑的grid
110extjs学习札记(六-3) grid中数据的保存,添加和删除    var grid = new Ext.grid.EditorGridPanel({
111extjs学习札记(六-3) grid中数据的保存,添加和删除        //sm: new Ext.grid.RowSelectionModel({ singleSelect: false }),
112extjs学习札记(六-3) grid中数据的保存,添加和删除        sm: sm,
113extjs学习札记(六-3) grid中数据的保存,添加和删除        store: store,
114extjs学习札记(六-3) grid中数据的保存,添加和删除        cm: cm,
115extjs学习札记(六-3) grid中数据的保存,添加和删除        renderTo: 'grid',
116extjs学习札记(六-3) grid中数据的保存,添加和删除        width: 600,
117extjs学习札记(六-3) grid中数据的保存,添加和删除        height: 300,
118extjs学习札记(六-3) grid中数据的保存,添加和删除        autoExpandColumn: 'common',
119extjs学习札记(六-3) grid中数据的保存,添加和删除        title: 'Edit Plants?',
120extjs学习札记(六-3) grid中数据的保存,添加和删除        frame: true,
121extjs学习札记(六-3) grid中数据的保存,添加和删除        plugins: checkColumn,
122extjs学习札记(六-3) grid中数据的保存,添加和删除        clicksToEdit: 2,
123extjs学习札记(六-3) grid中数据的保存,添加和删除        listeners: {
124extjs学习札记(六-3) grid中数据的保存,添加和删除            "afterEdit": {
125extjs学习札记(六-3) grid中数据的保存,添加和删除                fn: afterEdit,
126extjs学习札记(六-3) grid中数据的保存,添加和删除                scope: this
127extjs学习札记(六-3) grid中数据的保存,添加和删除            }
128extjs学习札记(六-3) grid中数据的保存,添加和删除        },
129extjs学习札记(六-3) grid中数据的保存,添加和删除        tbar: [{
130extjs学习札记(六-3) grid中数据的保存,添加和删除            text: "保存",
131extjs学习札记(六-3) grid中数据的保存,添加和删除            handler: function() {
132extjs学习札记(六-3) grid中数据的保存,添加和删除                var modified = store.modified;
133extjs学习札记(六-3) grid中数据的保存,添加和删除                updateData(modified);
134extjs学习札记(六-3) grid中数据的保存,添加和删除            }
135extjs学习札记(六-3) grid中数据的保存,添加和删除        },
136extjs学习札记(六-3) grid中数据的保存,添加和删除            '-',
137extjs学习札记(六-3) grid中数据的保存,添加和删除            {
138extjs学习札记(六-3) grid中数据的保存,添加和删除                text: "增加",
139extjs学习札记(六-3) grid中数据的保存,添加和删除                handler: function() {
140extjs学习札记(六-3) grid中数据的保存,添加和删除                    var Plant = store.recordType;
141extjs学习札记(六-3) grid中数据的保存,添加和删除                    var p = new Plant({
142extjs学习札记(六-3) grid中数据的保存,添加和删除                        common: 'New Plant 1',
143extjs学习札记(六-3) grid中数据的保存,添加和删除                        light: 'Mostly Shade',
144extjs学习札记(六-3) grid中数据的保存,添加和删除                        price: 0,
145extjs学习札记(六-3) grid中数据的保存,添加和删除                        availDate: (new Date()).clearTime(),
146extjs学习札记(六-3) grid中数据的保存,添加和删除                        indoor: false
147extjs学习札记(六-3) grid中数据的保存,添加和删除                    });
148extjs学习札记(六-3) grid中数据的保存,添加和删除                    grid.stopEditing();
149extjs学习札记(六-3) grid中数据的保存,添加和删除                    store.insert(0, p);
150extjs学习札记(六-3) grid中数据的保存,添加和删除                    grid.startEditing(0, 0);
151extjs学习札记(六-3) grid中数据的保存,添加和删除                }
152extjs学习札记(六-3) grid中数据的保存,添加和删除            },
153extjs学习札记(六-3) grid中数据的保存,添加和删除            " ",
154extjs学习札记(六-3) grid中数据的保存,添加和删除            {
155extjs学习札记(六-3) grid中数据的保存,添加和删除                text: "删除",
156extjs学习札记(六-3) grid中数据的保存,添加和删除                handler: function() {
157extjs学习札记(六-3) grid中数据的保存,添加和删除                    var selModel = grid.getSelectionModel();
158extjs学习札记(六-3) grid中数据的保存,添加和删除                    if (selModel.hasSelection()) {
159extjs学习札记(六-3) grid中数据的保存,添加和删除                        Ext.Msg.confirm("警告", "确定要删除吗?", function(button) {
160extjs学习札记(六-3) grid中数据的保存,添加和删除                            if (button == "yes") {
161extjs学习札记(六-3) grid中数据的保存,添加和删除                                var selections = selModel.getSelections();
162extjs学习札记(六-3) grid中数据的保存,添加和删除                                Ext.each(selections, function(item) {
163extjs学习札记(六-3) grid中数据的保存,添加和删除                                    store.remove(item);
164extjs学习札记(六-3) grid中数据的保存,添加和删除                                    store.removed.push(item);
165extjs学习札记(六-3) grid中数据的保存,添加和删除                                });
166extjs学习札记(六-3) grid中数据的保存,添加和删除                            }
167
168extjs学习札记(六-3) grid中数据的保存,添加和删除                        });
169extjs学习札记(六-3) grid中数据的保存,添加和删除                    }
170extjs学习札记(六-3) grid中数据的保存,添加和删除                    else {
171extjs学习札记(六-3) grid中数据的保存,添加和删除                        Ext.Msg.alert("错误", "没有任何行被选中,无法进行删除操作!");
172extjs学习札记(六-3) grid中数据的保存,添加和删除                    }
173extjs学习札记(六-3) grid中数据的保存,添加和删除                }
174extjs学习札记(六-3) grid中数据的保存,添加和删除            }
175extjs学习札记(六-3) grid中数据的保存,添加和删除                ]
176extjs学习札记(六-3) grid中数据的保存,添加和删除    });
177extjs学习札记(六-3) grid中数据的保存,添加和删除
178extjs学习札记(六-3) grid中数据的保存,添加和删除    // 触发数据的加载
179extjs学习札记(六-3) grid中数据的保存,添加和删除    store.load();
180extjs学习札记(六-3) grid中数据的保存,添加和删除
181extjs学习札记(六-3) grid中数据的保存,添加和删除    //发送数据到服务器端进行更新
182extjs学习札记(六-3) grid中数据的保存,添加和删除    function updateData(modified) {
183extjs学习札记(六-3) grid中数据的保存,添加和删除        var json = [];
184extjs学习札记(六-3) grid中数据的保存,添加和删除        Ext.each(modified, function(item) {
185extjs学习札记(六-3) grid中数据的保存,添加和删除            json.push(item.data);
186extjs学习札记(六-3) grid中数据的保存,添加和删除        });
187extjs学习札记(六-3) grid中数据的保存,添加和删除        if (json.length > 0) {
188extjs学习札记(六-3) grid中数据的保存,添加和删除            Ext.Ajax.request({
189extjs学习札记(六-3) grid中数据的保存,添加和删除                url: "EditGrid.aspx",
190extjs学习札记(六-3) grid中数据的保存,添加和删除                params: { data: Ext.util.JSON.encode(json) },
191extjs学习札记(六-3) grid中数据的保存,添加和删除                method: "POST",
192extjs学习札记(六-3) grid中数据的保存,添加和删除                success: function(response) {
193extjs学习札记(六-3) grid中数据的保存,添加和删除                    Ext.Msg.alert("信息", "数据更新成功!", function() { store.reload(); });
194extjs学习札记(六-3) grid中数据的保存,添加和删除                },
195extjs学习札记(六-3) grid中数据的保存,添加和删除                failure: function(response) {
196extjs学习札记(六-3) grid中数据的保存,添加和删除                    Ext.Msg.alert("警告", "数据更新失败,请稍后再试!");
197extjs学习札记(六-3) grid中数据的保存,添加和删除                }
198extjs学习札记(六-3) grid中数据的保存,添加和删除            });
199extjs学习札记(六-3) grid中数据的保存,添加和删除        }
200extjs学习札记(六-3) grid中数据的保存,添加和删除        else {
201extjs学习札记(六-3) grid中数据的保存,添加和删除            Ext.Msg.alert("警告", "没有任何需要更新的数据!");
202extjs学习札记(六-3) grid中数据的保存,添加和删除        }
203extjs学习札记(六-3) grid中数据的保存,添加和删除    }
204extjs学习札记(六-3) grid中数据的保存,添加和删除
205extjs学习札记(六-3) grid中数据的保存,添加和删除    //编辑后触发的事件,可在此进行数据有效性的验证
206extjs学习札记(六-3) grid中数据的保存,添加和删除    function afterEdit(e) {
207extjs学习札记(六-3) grid中数据的保存,添加和删除        if (e.field == "common") {
208extjs学习札记(六-3) grid中数据的保存,添加和删除            if (e.value == "大笨") {
209extjs学习札记(六-3) grid中数据的保存,添加和删除                Ext.Msg.alert("错误", "大笨是人物不是植物", function() { grid.startEditing(e.row, e.column) });
210extjs学习札记(六-3) grid中数据的保存,添加和删除            }
211extjs学习札记(六-3) grid中数据的保存,添加和删除        }
212extjs学习札记(六-3) grid中数据的保存,添加和删除    }
213extjs学习札记(六-3) grid中数据的保存,添加和删除});

    再运行一下看看,OK,我们想要的效果出来了:

extjs学习札记(六-3) grid中数据的保存,添加和删除

    最后我们来总结一下,当修改grid中的内容时,Store类的modified会自动将被修改的行保存下来;当删除的时候,Store类给我们提供了一个 removed属性,但不知道为什么不自动保存删除的行,不过自己添加也很简单;增加是最麻烦的,我们可能需要一些小技巧来保存添加的行,无论是修改的还是未修改的,可以都放到Store类的modified属性之中,也可以放在自己建的一个集合中,但是需要从modified里边去被添加之后修改的行。无论是编辑,增加或者删除操作,都是在本地进行,需要自己写代码将改动发送到服务器端进行处理。