zoukankan      html  css  js  c++  java
  • ExtJs实现SearchGrid查询表格

    实现在表格头部下文可以有对应的查询框,如附件图。代码如下:

        Ext.override(Ext.grid.GridView,{
        /**
        * 通过下标获取查询单个单元格元素
        **/
            getSearchCell : function(index) {
                return this.mainSh.dom.getElementsByTagName('td')[index];
            },
            /**
            * 手动拖拉表头列的宽度
            **/
            updateColumnWidth : function(column, width) {

                var columnWidth = this.getColumnWidth(column),
                    totalWidth  = this.getTotalWidth(),
                    headerCell  = this.getHeaderCell(column),
                    searchCell  = this.getSearchCell(column),//获取查询单元格元素
                    nodes       = this.getRows(),
                    nodeCount   = nodes.length,
                    row, i, firstChild;
               
                this.updateHeaderWidth();
                this.updateSearchWidth();//更新所有查询列的宽度
                headerCell.style.width = columnWidth;
                searchCell.style.width = columnWidth;//更新当前单元格的宽度
                for (i = 0; i < nodeCount; i++) {
                    row = nodes[i];
                    firstChild = row.firstChild;
                   
                    row.style.width = totalWidth;
                    if (firstChild) {
                        firstChild.style.width = totalWidth;
                        firstChild.rows[0].childNodes[column].style.width = columnWidth;
                    }
                }
               
                this.onColumnWidthUpdated(column, columnWidth, totalWidth);
            },
            renderUI : function() {
                var templates = this.templates;
               
                return templates.master.apply({
                    body  : templates.body.apply({rows:'&#160;'}),
                    header: this.renderHeaders(),
                    ostyle: '' + this.getOffsetWidth() + ';',
                    bstyle: '' + this.getTotalWidth()  + ';',
                    search:this.renderSearch()//渲染
                });
            },
            /**
            * 更新查询列
            **/
            updateSearch : function() {
                this.innerSh.firstChild.innerHTML = this.renderSearch();
                this.updateSearchWidth(false);
            },
           
            /**
             * 更新查询列的宽度
             */
            updateSearchWidth: function(updateMain) {
                var innerShChild = this.innerSh.firstChild,
                    totalWidth   = this.getTotalWidth();
               
                innerShChild.style.width = this.getOffsetWidth();
                innerShChild.firstChild.style.width = totalWidth;

                if (updateMain !== false) {
                    this.mainBody.dom.style.width = totalWidth;
                }
            },
            initElements : function() {
                var Element  = Ext.Element,
                    el       = Ext.get(this.grid.getGridEl().dom.firstChild),
                    mainWrap = new Element(el.child('div.x-grid3-viewport')),
                    mainHd   = new Element(mainWrap.child('div.x-grid3-header')),
                    mainSh   = new Element(mainWrap.child('div.x-grid3-search')),//在原来的基础上加查询行
                    scroller = new Element(mainWrap.child('div.x-grid3-scroller'));
               
                if (this.grid.hideHeaders) {
                    mainHd.setDisplayed(false);
                }
               
                if (this.forceFit) {
                    scroller.setStyle('overflow-x', 'hidden');
                }
               
                /**
                 * <i>Read-only</i>. The GridView's body Element which encapsulates all rows in the Grid.
                 * This {@link Ext.Element Element} is only available after the GridPanel has been rendered.
                 * @type Ext.Element
                 * @property mainBody
                 */
               
                Ext.apply(this, {
                    el      : el,
                    mainWrap: mainWrap,
                    scroller: scroller,
                    mainHd  : mainHd,欠款
                    mainSh  : mainSh,
                    innerHd : mainHd.child('div.x-grid3-header-inner').dom,
                    innerSh : mainSh.child('div.x-grid3-search-inner').dom,//在原来的基础上加上查询列
                    mainBody: new Element(Element.fly(scroller).child('div.x-grid3-body')),
                    focusEl : new Element(Element.fly(scroller).child('a')),
                   
                    resizeMarker: new Element(el.child('div.x-grid3-resize-marker')),
                    resizeProxy : new Element(el.child('div.x-grid3-resize-proxy'))
                });
               
                this.focusEl.swallowEvent('click', true);
            }, 
       
            masterTpl:new Ext.Template(
                '<div class="x-grid3" hidefocus="true">',
                    '<div class="x-grid3-viewport">',
                        '<div class="x-grid3-header">',
                            '<div class="x-grid3-header-inner">',
                                '<div class="x-grid3-header-offset" style="{ostyle}">{header}</div>',
                            '</div>',
                            '<div class="x-clear"></div>',
                        '</div>',
                        //查询框所需要的模板
                         '<div class="x-grid3-search">',
                            '<div class="x-grid3-search-inner">',
                                '<div class="x-grid3-search-offset" style="{ostyle}">{search}</div>',
                            '</div>',
                            '<div class="x-clear"></div>',女装品牌大全
                        '</div>',
                        //========================
                        '<div class="x-grid3-scroller">',
                            '<div class="x-grid3-body" style="{bstyle}">{body}</div>',
                            '<a href="#" class="x-grid3-focus" tabIndex="-1"></a>',
                        '</div>',
                    '</div>',
                    '<div class="x-grid3-resize-marker">&#160;</div>',
                    '<div class="x-grid3-resize-proxy">&#160;</div>',
                '</div>'
            ),
            /**
            * 渲染查询表格
            **/
            renderSearch : function() {
                    var colModel   = this.cm,
                    templates  = this.templates,
                    properties = {},
                    colCount   = colModel.getColumnCount(),
                    searchCells = [],
                    i;
                    templates.sCell=new Ext.Template(
                        '<td style="{style}" ><div id="search-{id}"></div></td>'//列的模板,id可以在columnModel设置,如果没有则是从0开始,例如search-0,search-2,后面我们使用search-{id}来渲染我们所需要的查询控件
                    );
                    templates.seatchTpl=new Ext.Template(
                        '<table  border="0" cellspacing="0" cellpadding="0" style="{tstyle}"><tr>{cells}</tr></table>'//整个查询框的模板
                    );
                    for (i = 0; i < colCount; i++) {
                       
                        properties = {
                            id     : colModel.getColumnId(i),
                            style  : this.getColumnStyle(i, true)
                        };
                       
                        searchCells[i] = templates.sCell.apply(properties);
                       
                    }
                    return templates.seatchTpl.apply({
                        cells: searchCells.join(""),
                        tstyle: String.format(" {0};", this.getTotalWidth())
                    });
            }
        });

    使用方法:

    注意要在表格数据加载后,执行下面这段话,这个顺序一定要注意,要不可以渲染不了。

        //例子
        var combo = new Ext.form.ComboBox({
            store: store,
            displayField:'state',
            mode: 'local',
            triggerAction: 'all',
            100,
            renderTo: 'search-2'//这个就是在渲染的DIV的ID,在templates.sCell定义了这个ID
        });

  • 相关阅读:
    Vue vue-resource三种请求数据方式pet,post,jsonp
    Vue 各个阶段生命周期函数
    Vue v-if和v-show的使用.区别
    vue v-for循环中key属性的使用
    vue v-for循环使用
    Vue 设置style属性
    Vue 设置class样式
    Vue 双向数据绑定v-model
    Vue的事件修饰符
    关于“svn: Can't connect to host '*.*.*.*': 由于连接方在一段时间后没有正确答复或连接”的解决方法
  • 原文地址:https://www.cnblogs.com/sky7034/p/2148910.html
Copyright © 2011-2022 走看看