使用jqGrid 4.5.2& jQuery 1.9.1。我在网页中有一个jqGrid,显示从查询返回的数据行。网格中的每一行都有2个submit
按钮,默认情况下已禁用,但在jqGrid的onSelectRow
事件中启用。
我在下面的代码中添加按钮:
var ids = $("#myGrid").jqGrid("getDataIDs");
for (var i=0;i < ids.length;i++) {
var cl = ids[i];
sm = "<input id='resendMsg' style='height:25px;width:65px;' type='submit' value='Re-Send' disabled='true' />";
ca = "<input id='cancelMsg' style='height:25px;width:55px;' type='submit' value='Cancel' disabled='true' />";
$("#myGrid").jqGrid("setRowData",ids[i], {msgAct:sm+ca});
}
请注意,submit
按钮默认为已停用。
如果选择了网格中的某一行,我希望仅的两个按钮为enabled
。同样发生在onSelectRow
事件中的是我设置变量以供以后使用的地方。
var gridRow = $(this).jqGrid("getRowData",id);
var srow = $(this).jqGrid("getGridParam","selrow");
onSelectRow
-
不希望能够单击该行 - 必须单击2个提交按钮之一才能转到网格中的另一行。
一个提交采取一套行动&amp;然后重置网格(没有选择任何内容并且所有行上的所有按钮都被禁用)
另一个提交按钮(Cancel
按钮)不执行上一步中的操作,但会重置网格(未选择任何内容,并禁用所有行上的所有按钮)。
我已经尝试了各种方法来启用所选行上的按钮,但它只启用第一行,所有行或没有行。我已经查看了srow
上面的值&amp;可以确认它具有该行的正确ID。
如何定位所选行中的提交按钮以启用它们(以及禁用网格中的所有其他按钮)?
谢谢!
编辑:
感谢@Oleg&amp;他的建议和跟进,我能够解决我的问题。 @ Oleg的回应让我走上正轨。
在colModel
我放msgAct
以获取每行上的按钮&amp;与该行相关联。
{name: "msgAct",
width: col4width,
align: "center",
formatter: function() {
return "<input name='resendMsg' style='height:25px;width:65px;' type='submit' value='Re-Send' disabled='disabled' />" +
"<input name='cancelMsg' style='height:25px;width:55px;' type='submit' value='Cancel' disabled='disabled' />"
}}
在OnSelectRow
中,我还使用了他的建议来关闭jqGrid&amp;中的所有按钮。然后打开我选择的行中的那些。
// disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
// now enable the buttons for the current row only
$(tr).find("input[name=resendMsg]").removeAttr("disabled");
$(tr).find("input[name=cancelMsg]").removeAttr("disabled");
我还有其他代码来禁用页面上的任何其他下拉菜单,因此只有三种情况中的一种可能发生:
由于上面的#3会触发另一个OnSelectRow
事件,我希望用户必须使用所选行执行某些事情。
使用@ Oleg建议关闭所有&amp;然后只打开所选行的按钮,我还在onSelectRow
事件中为每个按钮添加了点击事件代码。
$(tr).find("input[name=cancelMsg]").click(function() {
// disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
....do other stuff .....
ReloadGrid();
});
$(tr).find("input[name=resendMsg]").click(function() {
ReSend(gridRow.Col1, gridRow.Col2);
// disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
.... do other stuff ....
});
},
网格现在可以完成我想要它做的事情。例如 -
现在的问题可能是 - 有更好的方法吗?
感谢@Oleg的宝贵帮助!
答案 0 :(得分:3)
主要问题是创建错误的HTML数据。
您在网格的所有行中添加了相同 ID(id='resendMsg'
和id='cancelMsg'
)的按钮,但id
属性在整体上必须是唯一的HTML页面。如果您尝试通过id索引启用该按钮,您可能会发现只有第一个具有id的按钮。它通常来自第一行的按钮。您可以使用name
属性代替id
属性
另一个问题是disabled属性使用了错误的值。如果您希望代码在所有网络浏览器中正常运行,则应使用disabled='disabled'
代替disabled='true'
。
创建此类按钮的最佳方法是使用custom formatter。您可以在formatter
中添加msgAct
属性,直接创建按钮 。代码可以是以下
colModel: [
...
{ name: "msgAct", width: 150,
formatter: function () {
return "<input name='resendMsg' style='height:25px;width:65px;' type='submit' value='Re-Send' disabled='disabled'/>" +
"<input name='cancelMsg' style='height:25px;width:55px;' type='submit' value='Cancel' disabled='disabled'/>"
}}
],
onSelectRow: function (rowid) {
var tr = $(this).jqGrid("getInd", rowid, true);
// first disable all "resendMsg" buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled", "disabled");
// then enable the button from the current row only
$(tr).find("input[name=resendMsg]").removeAttr("disabled");
},
gridview: true
The answer描述了使用gridview: true
和自定义格式化程序的优势。