2012-12-14 69 views
0

我遇到问题。我正在使用jqGrid的单元格编辑。我不希望为了内嵌编辑而改变它,因为我需要保持这种状态,只允许一次编辑一个单元格。jqGrid:使用单元格编辑编辑多个单元格

问题是我有一个字段,编辑后需要强制编辑其他单元格。所以,如果用户将第一个单元格更改为特定值,我需要这些单元格以进行编辑。

有没有办法做到这一点?我曾尝试使用.jqGrid('editCell',...),但这种方式一次只能用一个单元格来完成。而且我不能要求下一个要编辑的单元格来强制编辑第3个和最后一个单元格,因为可能发生用户想单独编辑第2个单元格的情况,这会导致此行为。

任何方式来做到这一点?

感谢

UPD

为了使这更清晰,我举一个例子。假设你有一张桌子,列出你附近的人有的汽车。它有4个单元:

ID - CarCompany - 模式 - 年

其中id是一些标识字段,CarCompany是制造汽车的公司的名称,型号是模型的名称和新年是一年的模式。

因此,例如,您有以下记录:

0 - 福特 - 福克斯 - 2010

1 - 凯迪拉克 - 凯雷德 - 2004年

2 - 兰博基尼 - 暗黑破坏神 - 2012

业主可以更换汽车。他们可以改变年份,不应该改变任何其他单元格(因为他们改变了他们的汽车为他们当前汽车的新版本),他们可以在同一年改变模型为另一个。但是,如果他们为另一家公司更换汽车,则必须更新型号和年份(假设您必须更改年份)。因此:

  • 如果更改年份,那就是你必须改变
  • 如果更改模型中唯一的细胞,这就是你必须改变
  • 唯一细胞,但如果更改CarCompany,你必须编辑型号和年份。

回答

1

如果我理解你的问题是正确的,你可以使用afterSaveCell回调函数或其他更好的符合你的要求的函数(见here)。您可以测试修改了哪一列,并明确呼叫editCell以建议编辑依赖的单元格。可能您可以使用额外的自定义验证规则(请参阅here)以确保用户真正将相关单元修改为正确的值。

修订The demo显示了如何调用editCellafterSaveCell回调内部实现你需要的行为。演示代码中最重要的部分将在下面找到:

var carCompanyEditingMode = false; 

$("#list").jqGrid({ 
    ... 
    afterSaveCell: function (rowid, cellname, value, iRow, iCol) { 
     var $this = $(this), editedColName = this.p.colModel[iCol].name; 
     if (editedColName === "carCompany") { 
      setTimeout(function() { 
       $this.jqGrid("editCell", iRow, iCol + 1, true); 
      }, 50); 
      carCompanyEditingMode = true; 
      return; 
     } 
     if (carCompanyEditingMode && editedColName === "model") { 
      setTimeout(function() { 
       $this.jqGrid("editCell", iRow, iCol + 1, true); 
      }, 50); 
      return; 
     } 
     if (carCompanyEditingMode && editedColName === "year") { 
      carCompanyEditingMode = false; 
     } 
    }, 
    beforeSelectRow: function() { 
     // don't allow editing of another row if 
     // the carCompanyEditingMode is true 
     return !carCompanyEditingMode; 
    }, 
    afterRestoreCell: function (rowid, value, iRow, iCol) { 
     var $this = $(this); 
     if (carCompanyEditingMode) { 
      // continue editing of the same cell 
      setTimeout(function() { 
       $this.jqGrid("editCell", iRow, iCol, true); 
      }, 50); 
     } 
    } 

}); 
+0

该方法的问题是我一直只能用它来一次打开一个单元。当满足条件时,我需要打开两个单元格。我可以连接编辑单元的调用,因为其他单元格可以单独编辑,而无需采用这种方式。 – Heathcliff

+0

@希思克利夫:对不起,但我不能跟着你。如果直接从一列修改单元格后(或者如果用户在单元格中输入特定值),用户将不得不修改行中的第二个单元格,看起来像您原来的要求一样。关于'afterSaveCell',你可以捕获第一个单元格的编辑结束,并用第二个单元格调用editCell。 – Oleg

+0

如果我用第一个单元格(要求用户编辑两个其他单元格的单元格)调用'editCell'编辑第二个单元格,我将无法编辑第三个单元格。我无法在第二个单元格的afterSaveCell事件中调用'editCell',因为该单元格的单独版本不需要用户编辑第三个单元格;如果用户编辑了第一个单元格,这就是它会编辑第二个单元格的原因。除非在第二个单元格的afterCellEvent中有我能做的事情要知道,如果用户编辑了第一个单元格,那就是他编辑第二个单元格的原因,我不能使用它。 – Heathcliff