JQGrid:根据内容动态设置单元格不可编辑

时间:2011-01-17 22:51:04

标签: javascript jquery jqgrid

我遇到一些问题,即使将列设置为可编辑,也会使某些单元格(使用cellEdit:true)不可编辑。

我尝试了很多方法,比如beforeEditCell,格式化程序等。似乎无法正常工作。

我最接近的是将格式化程序设置为我想要编辑的列,然后使用setCell设置'not-editable-cell'类(下面的代码段)。第一次单击单元格时,它很可能进入编辑模式,但是如果您单击其他位置并尝试重新编辑单元格,则它已成功无法编辑。

我也尝试使用相同的剪切但在beforeEditCell内部,它成功地阻止了单元格的编辑,但反过来“冻结”网格。您无法再选择任何其他单元格。

function noEditFormatter(cellValue, options, rowObject) {
    if (cellValue == 'test')
        jQuery("#grid").jqGrid('setCell', options.rowId, 'ColName', '', 'not-editable-cell');
    return cellValue;
}

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:12)

使用setCell方法将类'not-editable-cell'添加到应该不可编辑的单元格的想法是正确的。你只选择了错误的地方。在自定义格式化器内部,网格可能尚未构建到最后。我建议您使用loadCompletegridComplete检查当前页面的网格包含,并将某些单元格标记为不可编辑。

我准备了an example来证明这一点。与您的示例中一样,所有具有“测试”文本的单元格都标记为不可编辑。您可以检查一个单元格并将另一个单元格标记为不可编辑。

答案 1 :(得分:3)

var cellattr = function(rowId, tv, rawObject, cm, rdata) {
if(rawObject.locked) return ' class="not-editable-cell"';

};

在colModel中: 每列选项添加

{name: 'name',index: 'name', editable: true, width: 100, sortable: false, align: 'center', cellattr: cellattr}

答案 2 :(得分:1)

我现在必须解决这个问题(2015)并找到an approach that looks clean:如果不允许编辑单元格,请为cellbeginedit指定一个返回false的函数。取自链接文章并修改:

var checkIfRowIsValid = function (rowIndex) {
    //somehow get cellValue
    ...
    if (cellValue == 'test') return false;
}
// initialize jqxGrid
$("#jqxgrid").jqxGrid(
{
    source: dataAdapter,
    editable: true,
    selectionmode: 'singlecell',
    columns: [
        { text: 'First Name', columntype: 'textbox', datafield: 'firstname',
        width: 90, cellbeginedit: checkIfRowIsValid},
        { text: 'Last Name', datafield: 'lastname', columntype: 'textbox',
        width: 90, cellbeginedit: checkIfRowIsValid}
    ]
});