成功搞定一個通用的Extjs增刪改查模塊


最近研究Extjs , 發現經常用的是數據表的增刪改查,每次都需要重新寫panel,很費勁,於是想寫一個通用的Extjs增刪改查模塊。模塊又如下幾個部分組成。

入口函數如下:

function getADES(dataliststr, url, searchstr, idpanel, namepanel,mainIndex) {

    var tstore = getStore(url, dataliststr);
    tstore.load({ params: { start: 0, limit: 10} });
    var grid = new Ext.grid.GridPanel({
        height:300,
        width:400,
        store: tstore,
        id:idpanel,
        loadMask:true,
        trackMaskOver: true,
        cm: getCM(dataliststr),
        bbar: getPTB(dataliststr, searchstr,url, idpanel,namepanel,mainIndex)
    });
    //Ext.getCmp(idpanel).reload();
    var userPanel = new Ext.Panel({
        title:namepanel,
        items:grid,
        layout:'fit',
        region: 'center',
        collapsible: true,
        loadMask:{msg:'wait......'}
    });
    return userPanel;

};

簡單說明一下:dataliststr ,封裝我們需要的數據表字段 ,比如'ID,name,department'.組織成這樣的結構,url,是我們獲取數據的地址,searchstr,是我們搜索框中需要搜索的字段。idpanel是我們這個gridpanel需要的id,namepanel是我們窗體的名字。mainIndex,是我們數據表的主鍵字段,刪除的時候需要。

首先,我們需要獲得一個store。代碼如下:

function getStore(url, dataliststr) {
    var columns = new Array();
    var colarr = dataliststr.split(',');
    for (var i = 0; i < colarr.length; i++) {
        columns.push({
            name: colarr[i],
            type: 'string'
        });
    }
    var tmpRecord = new Ext.data.Record.create(columns);
    var store = new Ext.data.Store({
        proxy: new Ext.data.HttpProxy({
            url:url+"?cmd=list",
            method:'GET'
        }),
        remoteSort:true,
        reader: new Ext.data.JsonReader({
            root:"results"//,
            //totalProperty:'totalCount'  
        },tmpRecord)
    });
   
    
    return store;
}

后台代碼如下:

public partial class View_usermanage_proCate : System.Web.UI.Page
{
    private static ProCateManager pcManager = new ProCateManager();
    public string JsonTest = "";
    protected void Page_Load(object sender, EventArgs e)
    {
        string cmd = Request.QueryString["cmd"];
        /*
        List<string> columns = new List<string>();

        columns.Add("CateID");
        columns.Add("ProCate");
        string results = pcManager.getAllProCate(columns, 0, 10);
        JsonTest = results;
        */
        
        if (cmd.Equals("list"))
        {
            List<string> columns = new List<string>();

            columns.Add("CateID");
            columns.Add("ProCate");
            int start = int.Parse(Request.Params["start"]);
            int limit = int.Parse(Request.Params["limit"]);
            string results = pcManager.getAllProCate(columns, start, limit);
            JsonTest = results;
            Response.Write(results);
            Response.End();

        }
        if (cmd.Equals("add"))
        {
            string cate = Request.Params["ProCate"];
            pcManager.addProCate(cate);
            Response.Write("{success:true}");
            Response.End();
            
        }
        if (cmd.Equals("edit"))
        {
            Response.Write("can't edit");
            Response.End();
        }
        if (cmd.Equals("del"))
        {
            string id = Request.Params["uid"];
            string[] re = id.Split(',');
            foreach (string t in re)
            {
                pcManager.DelProcate(t);
            }
            Response.Write("{success:true}");
            Response.End();
        }
         
         
    }
}

因為重點不是后台,數據組織形式,我們用json的方式組織,具體根據實際的情況大家自己組織后台。

繼續講前台代碼,我們有store之后,需要構造gridPanel的cm結構。代碼如下:

function getCM(dataliststr) {

   
    var columns = new Array();
    //columns.push(new Ext.grid.RowNumberer());

    var colarr = dataliststr.split(',');
    for (var i = 0; i < colarr.length; i++) {
        columns.push({
            header:getStr(colarr[i]),
            dataIndex:colarr[i]
        });
    }
    var columnMode = new Ext.grid.ColumnModel(
        columns);
    return columnMode;
};

具體的就是,解析我們的dataliststr這個字符創,從而構造出相應的column結構。

最后,還剩下重中之重,pagingToolbar。這個里面含有增刪改查

代碼如下

function getPTB(dataliststr, searchstr, url, idpanel, namepanel,mainIndex) {
    var pagingToolbar = new Ext.PagingToolbar({
        pageSize: 10,
        displayInfo: true,
        store: store,
        displayMsg: 'show records {0} to {1}, total {2} records',
        emptyMsg: 'no data record',
        items: [{
            text: getStr('id_add'),
            handler: function (arg1, arg2, arg3, arg4) {

                add(dataliststr, url, idpanel, namepanel);
            }

        }, {
            text: getStr('id_edit'),
            handler: function (arg1, arg2, arg3, arg4) {
                edit(dataliststr, url, idpanel, namepanel);
            }
        }, {
            text: getStr('id_delete'),
            handler: function (arg1, arg2, arg3, arg4,arg5) {
                del(dataliststr, url, idpanel, namepanel,mainIndex);
            }
        }, {
            text: getStr('id_search'),
            handler: function () {
                Ext.Msg.prompt(searchstr, getStr('id_searchContext'), function (btn, text) {
                    if (btn == 'ok') {

                        store.filter(searchstr, text);
                    }
                });
            }
        }
        ]
    });
    return pagingToolbar;
};

由上,我們看出pagingToolbar中定義了add,edit,del,search的方法,其中search的方法,就是根據我們的主鍵進行搜索,這個地方將來也可以改成可以根據不同的字段進行搜索。

而這四個增刪改查的實現方法如下:

function add(dataliststr, url, idpanel, namepanel) {
    var columns = new Array();
    
    var colarr = dataliststr.split(',');
    for (var i = 0; i < colarr.length; i++) {
        columns.push({
            fieldLabel: getStr(colarr[i]),
            id:colarr[i],
            blankText:'not allow null'
        });
    }
    var win = new Ext.Window({
        title: namepanel,
        width: 500,
        height: 200,
        items: [{
            xtype: 'form',
            id: 'form1',
            height: 350,
            borderStyle: 'padding-top:3px',
            frame: true,
            defaultType: 'textfield',
            labelAlign: 'right',
            labelWidth: 57,
            defaluts: {
                allowBlank: false, width: 200
            },
            items: columns

        }],
        buttons: [{
            xtype: 'button',
            text: getStr('id_sure'),
            handler: function () {
                if (!Ext.getCmp('form1').getForm().isValid()) {
                    Ext.Msg.alert('input is unValid');
                    return false;
                }

                var paramstr = '({';
                for (var i = 0; i < colarr.length; i++) {
                    if (i == colarr.length - 1) {
                        paramstr +=  colarr[i] + ":'" + Ext.getCmp(colarr[i]).getValue() + "'})";
                    }
                    else {
                        paramstr +=  colarr[i] + ":'" + Ext.getCmp(colarr[i]).getValue() + "',";
                    }
                }
                paramstr = eval(paramstr);

                //Ext.Msg.alert('success', idpanel);
                Ext.lib.Ajax.defaultPostHeader += ";charset=utf-8";
                Ext.Ajax.request({
                    url: url + "?cmd=add",
                    params: paramstr,
                    method: 'POST',
                    success: function (response, opts) {
                        Ext.getCmp(idpanel).store.reload();
                        Ext.Msg.alert('info', response.responseText);
                        

                    },
                    failure: function (response, opts) {
                        Ext.Msg.alert('info', response.responseText);
                    }
                });
            }
        }, {
            xtype: 'button',
            text: getStr('id_cancel'),
            handler: function () {
                for (var i = 0; i < colarr.length; i++) {
                    Ext.getCmp(colarr[i]).setValue('');
                }
            }
        }]
    });
    win.show();
};
function edit(dataliststr, url, idpanel,namepanel) {

    var userRecord = Ext.getCmp(idpanel).getSelectionModel().getSelections();
    var columns = new Array();
    var colarr = dataliststr.split(',');
    var valarray = new Array();
    if (userRecord.length >= 1) {
       

    } else {
        Ext.Msg.alert('info','Not Select a Record!');
        return false;
    }
   
    for (var i = 0; i < colarr.length; i++) {
        columns.push({
            fieldLabel: getStr(colarr[i]),
            id: colarr[i],
            blankText: 'not allow null',
            value: userRecord[0].get(colarr[i])
        });
    }
    var win = new Ext.Window({
        title: namepanel,
        width: 500,
        height: 200,
        items: [{
            xtype: 'form',
            id: 'form1',
            height: 350,
            borderStyle: 'padding-top:3px',
            frame: true,
            defaultType: 'textfield',
            labelAlign: 'right',
            labelWidth: 57,
            defaluts: {
                allowBlank: false, width: 200
            },
            items: columns

        }],
        buttons: [{
            xtype: 'button',
            text: getStr('id_sure'),
            handler: function () {
                if (!Ext.getCmp('form1').getForm().isValid()) {
                    Ext.Msg.alert('input is unValid');
                    return false;
                }

                var paramstr = '({';
                for (var i = 0; i < colarr.length; i++) {
                    if (i == colarr.length - 1) {
                        paramstr += colarr[i] + ":'" + Ext.getCmp(colarr[i]).getValue() + "'})";
                    }
                    else {
                        paramstr += colarr[i] + ":'" + Ext.getCmp(colarr[i]).getValue() + "',";
                    }
                }
                paramstr = eval(paramstr);

                //Ext.Msg.alert('success', idpanel);
                Ext.lib.Ajax.defaultPostHeader += ";charset=utf-8";
                Ext.Ajax.request({
                    url: url + "?cmd=edit",
                    params: paramstr,
                    method: 'POST',
                    success: function (response, opts) {                    
                        Ext.getCmp(idpanel).store.reload();
                        Ext.Msg.alert('info', response.responseText);                       
                    },
                    failure: function (response, opts) {
                        Ext.Msg.alert('info', response.responseText);
                    }
                });
            }
        }, {
            xtype: 'button',
            text: getStr('id_cancel'),
            handler: function () {
                for (var i = 0; i < colarr.length; i++) {
                    Ext.getCmp(colarr[i]).setValue('');
                }
            }
        }]
    });
    win.show();
};
function del(dataliststr, url, idpanel, namepanel,mainIndex) {
    var userRecord = Ext.getCmp(idpanel).getSelectionModel().getSelections();
    var len = userRecord.length;
     var columns = new Array();
    var colarr = dataliststr.split(',');
    if (len == 0) {
        Ext.Msg.alert('Info', 'Not Select Record');
        return false;
    }

    Ext.Msg.confirm('Info', getStr('id_delconfirm'), function (btn) {
        var ids = "";
        if (btn == 'yes') {
            for (var i = 0; i < len; i++) {
                if (i == len - 1) {
                    ids += userRecord[i].get(mainIndex);
                }
                else {
                    ids += userRecord[i].get(mainIndex) + ',';
                }

            }

            Ext.Ajax.request({
                url: url+'?cmd=del',
                method: 'POST',
                params: {
                    'uid': ids
                },
                success: function (response, opts) {
                    Ext.getCmp(idpanel).store.reload();
                    Ext.Msg.alert('success', 'delete success');
                },
                failure: function (response, opts) {

                    Ext.Msg.alert('failure', 'delete failed');
                }
            })
        }
    });
};

相信大家比較容易看懂,我這篇不是入門篇,有關extjs的基礎知識,大家還需要查閱相關的文檔和手冊。

簡單說明一下自己進行數據解析的方法,首先因為我們有相應的數據表字段的相關信息,這樣,我們的labelField, params等結構都需要動態的創建。創建過程中我也遇到了不少麻煩。問了很多我qq群里的朋友在這里表示感謝。

最后貼幾張界面的圖

 

公司電腦加密比較麻煩,就不貼圖了,相應大家也能看出端倪。

 

另講講自己工作一年的牢騷。

 

畢業一年了,感覺技術一點長進也沒有。我對我自己的學習能力還是比較有信心的,extjs從接觸到今天用了5天,前3天看文檔,后兩天寫了幾個界面。這個是今天下午寫的。但是這一年來。我學的東西太雜了。

從java 轉到了.net , 學習了asp.net 學習了wcf 。前端后端都要我寫。 因為前端太難看,我又學習了extjs。 之前 ,做delphi開發  。因為覺得代碼寫的混亂,想用c# 重寫。於是看了wpf技術。寫了幾個模塊。領導說不用弄了。哎。真他媽坑爹。

另外,我自己是對后端比較感興趣的,也不想做這份工作。知道現在的主流是移動和雲。然后,我又自學了 android 開發 。 又開始看hadoop的相關知識。這些都能做,都可以做。沒錯。我的確是有很多時間學習。但是我覺得我永遠不能在一個方面深入下去了,將來也不知道怎么辦?

 

希望大家談談對這件事情的看法,大家做事情這是這么雜么?還是就我是這樣的。哎,苦逼!天哪!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM