• Extjs巧用Grid


    前两天用Extjs4.0做了可编辑的grid,在这里和大家分享一下
     
    1、目标:实现试题管理
     
    2、代码试题添加部分代码如下:
     




    /// <reference path="../Ext4.0/ext-all.js" />






    /**********************************************/
    /*选项列表*/



    // Define our data model
    Ext.define('SubjectOption', {
        extend: 'Ext.data.Model',
        fields: [

                { name: 'SubjectID', type: 'string' },
                { name: 'Item', type: 'string' },
                { name: 'ItemContent', type: 'string' }
            ]
    });



    var optionStore = Ext.create('Ext.data.Store', {
        // destroy the store if the grid is destroyed
        autoDestroy: true,
        model: 'SubjectOption',
        remoteSort: false,
        proxy: {
            type: 'ajax',
            //url: "Authority/GetAuthority",
            //   url: "Examlib/GetExamlibs",
            actionMethods: 'post',
            reader: {
                type: 'json',
                root: 'data'
            }
        }
    });

    var rowEditing = Ext.create('Ext.grid.plugin.RowEditing', {
        clicksToMoveEditor: 1,
        autoCancel: false
    });


    var sm = Ext.create('Ext.selection.CheckboxModel', {
        dataIndex: "Item"
    });
    // create the grid and specify what field you want
    // to use for the editor at each column.
    var optionGrid = Ext.create('Ext.grid.Panel', {
        selModel: sm,
        store: optionStore,
        id: "optionGrid",
        autoHeight: true,
        width:340,
        baseCls: "x-panel",
        multiSelect: true,
        height: document.documentElement.clientHeight * 3 / 8,
        columns: [{
            header: 'SubjectID',
            dataIndex: 'SubjectID',
            hidden: true
        }, {
            header: '選項',
            dataIndex: 'Item',
            width: 50,
            field: {
                xtype: 'textfield'
            }
        }, {
            header: '選項內容',
            dataIndex: 'ItemContent',
            flex: 1,
            field: {
                xtype: 'textfield'
            }
        }],


        frame: true,
        dockedItems: [{
            dock: 'top',
            xtype: 'toolbar',
            items: [
                      {
                          text: '新增',
                          iconCls: 'addicon',
                          handler: function () {
                              rowEditing.cancelEdit();

                              // Create a model instance


                              optionStore.insert(0, new SubjectOption());
                              rowEditing.startEdit(0, 0);
                          }
                      }, {
                          itemId: 'remove',
                          text: '刪除',
                          iconCls: 'deleteicon',
                          handler: function () {
                              var sm = optionGrid.getSelectionModel();
                              rowEditing.cancelEdit();
                              optionStore.remove(sm.getSelection());
                              if (optionStore.getCount() > 0) {
                                  sm.select(0);
                              }
                          },
                          disabled: true
                      }]
        }],
        plugins: [rowEditing],

        listeners: {
            'selectionchange': function (view, records) {
                optionGrid.down('#remove').setDisabled(!records.length);

            }
        }
    }
        );



    /**********************************************/
    /******************************************************/
    /**下拉框**/
    var typeStore = Ext.create('Ext.data.Store', {
        fields: ['Name', 'Value'],
        data: [
            { "Name": "單選題", "Value": "1" },
            { "Name": "複選題", "Value": "2" },
            { "Name": "是非題", "Value": "3" }
        ]
    });
    var levelStore = Ext.create('Ext.data.Store', {
        fields: ['Name', 'Value'],
        data: [
            { "Name": "簡單", "Value": "1" },
            { "Name": "中等", "Value": "2" },
            { "Name": "困難", "Value": "3" }
        ]
    });
    /****************************************************/
    /*選擇不同試題類型,默認出現選項*/

    var TypeComboBox = Ext.create('Ext.form.ComboBox', {
        fieldLabel: '試題類型',
        border: 0,
        id: "Type",
        labelWidth: 100,
        store: typeStore,
        mode: "local",
        value: "1",
        queryMode: 'local',
        displayField: 'Name',
        valueField: 'Value',
        triggerAction: "all",
        listeners: {
            "select": function (combo, record) {
                try {
                    var optionStore = Ext.getCmp("optionGrid").store;
                    optionStore.removeAll();
                    if (combo.getValue() == '1') {
                        optionStore.add({ SubjectID: '', Item: 'A', ItemContent: '' }, { SubjectID: '', Item: 'B', ItemContent: '' }, { SubjectID: '', Item: 'C', ItemContent: '' }, { SubjectID: '', Item: 'D', ItemContent: '' });
                    }
                    else if (combo.getValue() == '2') {
                        optionStore.add({ SubjectID: '', Item: 'A', ItemContent: '' }, { SubjectID: '', Item: 'B', ItemContent: '' }, { SubjectID: '', Item: 'C', ItemContent: '' }, { SubjectID: '', Item: 'D', ItemContent: '' }, { SubjectID: '', Item: 'E', ItemContent: '' });
                    }
                    else {
                        optionStore.add({ SubjectID: '', Item: '是', ItemContent: '' }, { SubjectID: '', Item: '否', ItemContent: '' });
                    }

                }
                catch (ex) {
                    Ext.MessageBox.alert("错误", "数据加载失败。");
                }
            },
            beforequery: function (qe) {

            }
        }
    });



    /**********************************************/

    AddInfos = function () {



        var AddInfoForm = Ext.create('Ext.form.Panel', {
            width: 350,
            height: document.documentElement.clientHeight * 1 / 4,
            plain: true,
            frame: true,
            id: "frmAdd",
            labelWidth: 45,
            defaultType: "textfield",
            baseCls: "x-plain",
            layout: 'anchor',
            defaults: { anchor: "95%", msgTarget: "side" },
            url: "Subject/Add",
            bodyStyle: 'padding:5px 0px 0px 5px',
            // The fields
            defaultType: 'textfield',
            items: [
               {
                  id: "Level",
                  name: "Level",
                  xtype: "combo",
                  fieldLabel: "級別",
                  //传入后台真实值value field /value
                  //hiddenName:"abcd",
                  //readOnly: true,
                  mode: "local",
                  displayField: "Name",
                  valueField: "Value",
                  triggerAction: "all",
                  value: "1",
                  store: levelStore
              }, TypeComboBox, {
                  fieldLabel: '試題內容',
                  height:50,
                  xtype: 'textareafield',
                  id: "Content",
                  name: 'Content',
                  allowBlank: false,
                  blankText: "試題內容不能為空"
              }, {
                  id: 'Key',
                  fieldLabel: '答案',
                  name: 'Key',
                  hidden: true
              }]
        });

        /*加入保存按鈕*/


        var btnSave = Ext.create('Ext.Button', {
            text: '保存',
            buttonAlign: "center",
            width: 60,
            listeners: {
                click: function () {

                    /*獲得輸入值*/
                    var Content = Ext.getCmp("Content").getValue();
                    var Level = Ext.getCmp("Level").getValue();
                    var Type = Ext.getCmp("Type").getValue();
                    var Key = Ext.getCmp("Key").getValue();

                    /*獲得選項grid*/
                    var optionGrid = Ext.getCmp("optionGrid");

                    /*選中的行為答案*/
                    var checkedrow = optionGrid.getSelectionModel().getSelection();
                    for (var i = 0; i < checkedrow.length; i++) {
                        if (checkedrow.length == 1) {
                            Key = checkedrow[i].data.Item;
                        }
                        else {

                            if (i < (checkedrow.length - 1)) {
                                Key = checkedrow[i].data.Item + "," + Key;
                            }
                            if (i == (checkedrow.length - 1)) {
                                Key = Key + checkedrow[i].data.Item;
                            }
                        }
                    }

                    /*保存選項,產生json*/
                    var arr = new Array();
                    optionGrid.store.each(function (record) {
                        arr.push(record.data);
                    }); ;
                    var json = Ext.encode(arr);

                    /*提交保存*/

                    var form = Ext.getCmp('frmAdd').getForm();
                    if (form.isValid()) {
                        Ext.Ajax.request({
                            url: "http://www.cnblogs.com/Subject/Add",
                            method: "POST",
                            params: {
                                Content: Content,
                                Level: Level,
                                Type: Type,
                                Key: Key,
                                json: json
                            },
                            success: function (form, action) {
                                //重新載入試題grid
                                var result = Ext.decode(form.responseText);
                                Ext.Msg.alert("恭喜", result.msg);

                                AddWin.hide();
                                store.load();
                            },
                            failure: function () {
                                Ext.Msg.alert("提 示", "新增失败!");
                            }
                        });
                    }
                }
            }
        });
        /**********************************************/

        var AddWin = Ext.create('Ext.window.Window', {
            title: '新增試題',
            width: 350,
            height: 350,

            labelWidth: 100,
            closeAction: 'hide',
            resizable: false,
            modal: 'true',
            border: 0,
            iconCls: "editicon",
            items: [
                AddInfoForm, optionGrid],

            buttonAlign: "center",
            bodyStyle: 'padding:0px 0px 0px 0px',
            buttons: [btnSave],
            listeners: {
                "show": function () {
                    optionStore.removeAll();
                    optionStore.add({ SubjectID: '', Item: 'A', ItemContent: '' }, { SubjectID: '', Item: 'B', ItemContent: '' }, { SubjectID: '', Item: 'C', ItemContent: '' }, { SubjectID: '', Item: 'D', ItemContent: '' });
                }
            }
        });
        AddWin.show();
    }
     
     
     
    3、效果图
     
     
     
     
    (1)添加试题选时,需要将grid中的store 序列化成Json,Extjs内部有方法
     
        /*保存選項,產生json*/
                    var arr = new Array();
                    optionGrid.store.each(function (record) {
                        arr.push(record.data);
                    }); ;
                    var json = Ext.encode(arr);
     
    这样就传到后台
     
    .net通过方法Deserialize解析传入的json
    成为泛型集合类
     
     

    public  T Deserialize<T>(string sJson) where T : class
              {
                  DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
                  MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(sJson));
                  T obj = (T)ds.ReadObject(ms);

                  ms.Close();
                  return obj;
              }
     
    调用如下
     
    List<SubjectOption> options = jsonHelper.Deserialize<List<SubjectOption>>(json);
     
    (2)可编辑grid
     
     
     
                            text: '新增',
                          iconCls: 'addicon',
                          handler: function () {
                              rowEditing.cancelEdit();

                              // Create a model instance


                              optionStore.insert(0, new SubjectOption());
                              rowEditing.startEdit(0, 0);
                          }
     
     
     
     
     
     
     
     
     
     
     





  • 相关阅读:
    农夫安全第二季课程-3.vmware ESXIv2
    六、表达式:前缀&&后缀
    五、数据类型(1):整数&&带小数点的数
    四、变量和常量
    三、简单的输入输出
    二、第一个C程序:Hello World!
    一、环境的安装Dev-C++
    .Net基础之5——复杂数据类型
    .Net基础之4——流程控制
    .Net基础之3——运算符
  • 原文地址:https://www.cnblogs.com/zuifengke/p/781f6a17949e9835b3cd5f7352301179.html
Copyright © 2020-2023  润新知