简体   繁体   English

使ExtJS GridPanel的某些单元格不可编辑

[英]making certain cells of an ExtJS GridPanel un-editable

I currently have a GridPanel with the Ext.ux.RowEditor plugin. 我目前有一个带有Ext.ux.RowEditor插件的GridPanel。 Four fields exist in the row editor: port, ip address, subnet and DHCP. 行编辑器中存在四个字段:端口,IP地址,子网和DHCP。 If the DHCP field (checkbox) of the selected row is checked, I need to make the other three fields un-editable. 如果选中所选行的DHCP字段(复选框),我需要使其他三个字段不可编辑。

I've been trying to perform this code when the beforeedit event is triggered, but to no avail... I've only found ways to make the entire column un-editable. 我一直试图在触发beforeedit事件时执行此代码,但无济于事......我只找到了使整个列不可编辑的方法。 My code so far: 我的代码到目前为止:

this.rowEditor.on({
    scope: this,
    beforeedit: this.checkIfEditable
});

checkIfEditable:function(rowEditor, rowIndex) {
    if(this.getStore().getAt(rowIndex).get('dhcp')) {
        // this function makes the entire column un-editable:
        this.getColumnModel().setEditable(2, false); 

        // I want to make only the other three fields of the current row 
        // uneditable.
    }
 }

Please let me know if any clarification is needed. 如果需要澄清,请告诉我。

Any help potentially extending RowEditor to accomplish the target functionality would be greatly appreciated as well! 任何有助于扩展RowEditor以完成目标功能的帮助也将非常受欢迎!

You can add into RowEditor.js within the function startEditing the call to the function isCellEditable 您可以在函数startEditing添加到RowEditor.js中,调用函数isCellEditable

//.... RowEditor.js
startEditing: function(rowIndex, doFocus){
//.... search for the starting of the below loop into the source code
            var cm = g.getColumnModel(), fields = this.items.items, f, val;
            for(var i = 0, len = cm.getColumnCount(); i < len; i++){
                val = this.preEditValue(record, cm.getDataIndex(i));
                f = fields[i];
                f.setValue(val);

                // *** here add a call to isCellEditable *** //
                f.setDisabled(!cm.isCellEditable(i, rowIndex));
                // ***************************************** //

                this.values[f.id] = Ext.isEmpty(val) ? '' : val;
            }
//....

Then override the isCellEditable of your column model and disabled the field based on you condition: 然后覆盖列模型的isCellEditable并根据您的条件禁用该字段:

YYY.getColumnModel().isCellEditable = function(colIndex, rowIndex){
 if (grid.getStore().getAt(rowIndex).get('dhcp')) {
    // you can do more check base on colIndex
    // only to disabled the one you want
    return false; 
  }
  return Ext.grid.ColumnModel.prototype.isCellEditable.call(this, colIndex, rowIndex);
}

As the docs state: 正如文档所述:

If the listener returns false the editor will not be activated. 如果侦听器返回false,则不会激活编辑器。

So... 所以...

this.rowEditor.on({
      scope: this,
     beforeedit: this.checkIfEditable
});

checkIfEditable:function(rowEditor, rowIndex) {
         if(this.getStore().getAt(rowIndex).get('dhcp')) {

             return false; 

         }
 }

Simply returning false will be enough to cancel the editing ability. 简单地返回false就足以取消编辑功能。


Gotcha. 疑难杂症。

Interesting idea - a bit of a hassle to implement, but possible. 有趣的想法 - 实施有点麻烦,但可能。

You need to approach this from two directions: 您需要从两个方向来解决这个问题:

1 ) edit starts 1)编辑开始

2 ) checkbox is checked/unchecked 2)选中/取消选中复选框

For the first part, I think you could use almost the same code I have above, remove the 'return false' and use the reference to the rowEditor to loop through the items collection, disabling (call the disable method on them) the fields that are not your checkbox field. 对于第一部分,我认为你可以使用我上面几乎相同的代码,删除'return false'并使用对rowEditor的引用来循环遍历items集合,禁用(对它们调用disable方法)的字段不是你的复选框字段。

The second part of this is to add a handler to the checkbox which would do the same thing. 第二部分是向复选框添加一个处理程序,它可以执行相同的操作。

The following works to make a specific cell uneditable (add the event to the roweditor): 以下工作使特定单元格无法编辑(将事件添加到roweditor):

    beforeedit: function (roweditor, rowIndex) {
        var data = roweditor.grid.store.getAt(rowIndex).data;
        var cm = roweditor.grid.getColumnModel();

        // disable the first column (can not be edited)
        if (** make your check here ***) {
            var c = cm.getColumnAt(0);
            c.editor.disable();
        }
        roweditor.initFields();
    }

Here's the simpler version : 这是更简单的版本:

http://jsfiddle.net/snehalmasne/8twwywcp/ http://jsfiddle.net/snehalmasne/8twwywcp/

plugins: [
    Ext.create('Ext.grid.plugin.CellEditing', {
        clicksToEdit: 1
        ,pluginId: 'editing'
    })
]

Provide the condition below for the cells to make the un-editable : 为单元格提供以下条件以使其不可编辑:

grid.on('beforeedit', function(editor, e) {
  if (e.record.get('phone') == '555-111-1224')
    return false;
});

As of ExtJS 3.4 you can just override isCellEditable, as in the example here: 从ExtJS 3.4开始,您可以覆盖isCellEditable,如下例所示:

http://docs.sencha.com/ext-js/3-4/#!/api/Ext.grid.ColumnModel-method-isCellEditable http://docs.sencha.com/ext-js/3-4/#!/api/Ext.grid.ColumnModel-method-isCellEditable

just set the column in your columnModel/columns to editable:false for fields that should not be editable. 只需将columnModel / columns中的列设置为editable:false即可填写不可编辑的字段。

columns: [ 
  { header: "Ticker", width: 60, editable:false },
  { header: "Company Name", width: 150, id: 'company'},
  { header: "Market Cap."},
  { header: "$ Sales", renderer: money},
  { header: "Employees", resizable: false}
]

I ran into the same problem. 我遇到了同样的问题。 Rather than using the GridPanel with the Ext.ux.RowEditor plugin, I used the Ext.grid.EditorGridPanel. 我使用了Ext.grid.EditorGridPanel,而不是将GridPanel与Ext.ux.RowEditor插件一起使用。 In this case, you can specify the editor for each of the other three fields (port, ip address, and subnet) in the column model with a beforeshow event handler as follows: 在这种情况下,您可以使用beforeshow事件处理程序为列模型中的其他三个字段(端口,IP地址和子网)中的每个字段指定编辑器,如下所示:

  editor: new Ext.form.TextArea({
    height:80,
    allowBlank: false,
    listeners:{
      beforeshow: function(column) {
        if (column.gridEditor.record.get('dhcp')) {
          column.gridEditor.cancelEdit();
        }
      }
    }
  })

Ha! 哈! I made a dirty one, I added an event this.fireEvent('starting', this, fields,record); 我做了一个脏的,我添加了一个事件this.fireEvent('starting',this,fields,record); AT THE END of startEditing 在startEditing结束时

startEditing: function(rowIndex, doFocus){
    if(this.editing && this.isDirty()){
        this.showTooltip(this.commitChangesText);
        return;
    }
    if(Ext.isObject(rowIndex)){
        rowIndex = this.grid.getStore().indexOf(rowIndex);
    }
    if(this.fireEvent('beforeedit', this, rowIndex) !== false){
        this.editing = true;
        var g = this.grid, view = g.getView(),
            row = view.getRow(rowIndex),
            record = g.store.getAt(rowIndex);

        this.record = record;
        this.rowIndex = rowIndex;
        this.values = {};
        if(!this.rendered){
            this.render(view.getEditorParent());
        }
        var w = Ext.fly(row).getWidth();
        this.setSize(w);
        if(!this.initialized){
            this.initFields();
        }
        var cm = g.getColumnModel(), fields = this.items.items, f, val;
        for(var i = 0, len = cm.getColumnCount(); i < len; i++){
            val = this.preEditValue(record, cm.getDataIndex(i));
            f = fields[i];
            f.setValue(val);
            this.values[f.id] = Ext.isEmpty(val) ? '' : val;
        }
        this.verifyLayout(true);
        if(!this.isVisible()){
            this.setPagePosition(Ext.fly(row).getXY());
        } else{
            this.el.setXY(Ext.fly(row).getXY(), {duration:0.15});
        }
        if(!this.isVisible()){
            this.show().doLayout();
        }
        if(doFocus !== false){
            this.doFocus.defer(this.focusDelay, this);
        }
        /*I ADDED THIS EVENT ---- contains the fields and record

*/ this.fireEvent('starting', this, fields,record); * / this.fireEvent('starting',this,fields,record); } } }}

THEN 然后

var editor = new Ext.ux.grid.RowEditor({
    saveText: 'Update',
    listeners : {
        'starting' : function(rowEditor, fields, record){
            if(!record.data.equipo_id){
                fields[4].setDisabled(false);
            }else{
                fields[4].setDisabled(true);
            }
        },

Using Ext JS 4 and the RowEditing plugin i managed to achieve this using something like 使用Ext JS 4和RowEditing插件我设法使用类似的东西来实现这一点

rowEditor.on('beforeedit', function (context) {
       this.editor.query('textfield')[0].setDisabled(/* your condition here */);
});

the record data is available through context.record.data 记录数据可通过context.record.data获得

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM