用combobox做了一个搜索框,搜索框是editgridpanel的一列,因为是搜索框,所以store会随搜索内容的变化而变化,搜索框根据store弹出下拉列表,调用renderer function遍历combobox的store来返回显示值,displayField和valueField为store的不同列。当我在表格中增加了多行时,比如两行,因为有两个搜索框,两个搜索框的store不同,最新增加的一行能正常显示,但是另一行因为只能遍历最新的store来返回显示值,而最新的store不一定包含了选择项,所以当另一行的其他列编辑时,搜索框调用renderer方法就有可能变为空。
请问有什么方法能在renderer function中得到当前行搜索框的显示值,或者是让renderer funtion在限制条件下触发,或者是其他方法。谢谢
截图,第二行改变数量一列,使第一列搜索框值变为空,因为改变数量触发了第一列搜索框的renderer方法,遍历store无值,所以变为空。

解决方案 »

  1.   

    搜索框主要代码
         var search = new Ext.form.ComboBox({
           store: ds_medicine,
             displayField:'TRADENAME',
             valueField: 'LEECHDOMDETAILNO',
             typeAhead: false,
             hiddenName: 'NAME',
             loadingText: '药品检索中...',
             name: 'NAME',
              width: 300,
             pageSize:20,
             mode: 'remote',
             listWidth: 800,
             hideTrigger:true,
             selectOnFocus: true,
             tpl: resultTpl,      
      itemSelector: 'tr.search',
             onKeyUp: function(e) {
                     _strSpellNo = search.getRawValue();
                     if (_strSpellNo == "") return;
                      var k = window.event.keyCode;
                     if (k != 37 && k != 38 && k != 39 && k != 40 && k != 13) {
                     var request = { start: 0, limit:20, spellNo: _strSpellNo };
                     ds_medicine.reload({ params: request });
                     setTimeout('', 500);
                     }
             }
           });
    //coulumnModel搜索框一列代码
             {
                    header: '名称',
                 dataIndex: 'NAME',
         width: 150,
         editor: search,
         renderer: function(value, metadata, record, rowIndex,colIndex, store){
         var returnValue;//返回值
         var medStore = search.getStore();//药品搜索框store
    medStore.each(function(rec){
    //遍历药品搜索store,当找到当前传入value对应行时,更新页面药品名称显示及规格、数量单位等信息
    if(rec.get('LEECHDOMDETAILNO')==value){
    record.set('GG',rec.get('SPECS'));
    if(rec.get('OUTPATIENTUNIT')=="包装"){
    record.set('SLDW',rec.get('PACK'));
    }
    if(rec.get('OUTPATIENTUNIT')=="单位"){
    record.set('SLDW',rec.get('UNIT'));
    }
    record.set('JLDW',rec.get('DOSAGEUNIT'));
    returnValue = rec.get('TRADENAME');
    }
    });
    return returnValue;
         }
        }
      

  2.   

    就是截图名称那一列是个用combobox做的药品搜索框,搜索时会重新加载store,列出药品列表,显示药品名称,实际的value是药品ID,现在有多行数据时我改变第二列的数量或者是其他列,会导致名称那一列原本有值变为空
      

  3.   

    原因我自己找到了,是因为combobox的store始终是最新搜索内容对应的store,所以在renderer function里面遍历store时有可能找不到药品id对应的药品,所以就显示为空。
    有没有什么方法能在名称一列的renderer方法里面得到显示值,现在能够得到的value是药品ID,但是我不可能每次renderer都重新去查一下数据库吧
      

  4.   

    header中
    renderer:function(value, metadata, record, rowIndex, colIndex, store){
       return record.get("药品ID");
    }
      

  5.   

    谢谢您的回复,可能你没明白我的意思,renderer里面返回的是药品名称才对,这样才能显示药品名称,而不是药品ID,药品ID是肯定能得到的,就是value值,我现在想得到显示在页面上的药品名称,函数里面我是通过遍历search这个combo的store来得到的,现在因为store会不断更新,所以会出现遍历不到的情况
      

  6.   

    结帖了,虽然没找到答案,自己解决了,用了隐藏列来保存药品名称,渲染的时候首先遍历当前combo的store,如果没找到值,则返回隐藏列的值。
    分都给你吧,还是谢谢你了zoujp_xyz