如何从jqgrid中的子网格访问父网格id

时间:2012-05-09 10:13:18

标签: jquery asp.net-mvc-3 jqgrid

我正在构建一个工作正常的jqgrid ......网格构造

if (jqent.isReq) {
    sbGrid.Append("subGrid: true,");
    sbGrid.Append("subGridRowExpanded: function (subgrid_id, row_id) {");
    sbGrid.Append(" $('#' + subgrid_id).html(renderhtmlforSubgrid(subgrid_id, row_id));},");
}

我有一个带有textarea的子网格和一个将由下面的代码

呈现的图像控件
function renderhtmlforSubgrid(subgrid_id, row_id) {
    var script = '<div style="margin-left:10px; margin-top:10px; margin-bottom:10px;">';
    script += '<textarea class="txtCommentwatermarkOn" id="txtCommentSection" name="txtCommentSection" rows=2 cols=20>Type your comments here</textarea>';
    script += '<input onclick=\"RenderModalPopup(' + row_id + ',' + subgrid_id + ',this);\" type="image" id="image" src="../../Content/Images/commentIcon.png"/>';
    script += '</div>';

    return script;
}

点击图片“RenderModalPopup”功能将被触发

function RenderModalPopup(rowid, tableid, event) {
    var dataFromRow = $('#tblArtifact1').jqGrid('getRowData', rowid);
    var PhaseArtifactId = $('#tblArtifact1').jqGrid('getCell', rowid, 'ID');
    ..........................

每件事情都运行良好......现在问题是我将网格ID硬编码为“tblArtifact1”以获取列值。需要删除。我可以获得网格ID吗?是否有任何预定义的参数/功能来获得它?

我被困了......请帮忙。

1 个答案:

答案 0 :(得分:3)

在回调函数subGridRowExpanded内,您可以使用this变量,该变量初始化为网格的DOM(<table>的DOM)。因此,您可以通过id获取父网格的this.id。如果您在renderhtmlforSubgrid内拨打subGridRowExpanded,我建议您使用

renderhtmlforSubgrid.call(this, subgrid_id, row_id)

而不是

renderhtmlforSubgrid(subgrid_id, row_id)

如果this内部的renderhtmlforSubgrid功能不会更改为全局window对象,您可以this为您提供有用的信息(例如{{} 1}}用于id或this.id用于jQuery说唱歌手到父网格。)

我建议您考虑在子网格中使用$(this)选项来防止ID重复(有关详细信息,请参阅the answer)。

此外,我从您的代码中看到,您是更多C#/ C ++开发人员,而不是JavaScript开发人员。两年前我遇到了同样的问题。 JavaScript有一些与众所周知的其他语言很接近的结构,但深层语义确实不同。因此,JavaScript开发人员有许多标准陷阱,他以错误的方式使用现有结构。

例如:您不应该使用变量,属性或特别是以大写字母开头的函数。目前idPrefixRenderModalPopup违反了规则。 JavaScript没有类,但可以使用函数创建紧密结构。在函数内部,您可以将属性分配给PhaseArtifactId。这些函数是“类”的构造函数,应该有第一个大写字母。要创建“类”的实例,应使用this。例如new

闭包是JavaScript中函数的另一个例子,它看起来像函数,但有很多重要的区别。

此外,我建议您使用更多的匿名函数和函数表达式(var now = new Date();)而不是函数语句(var renderhtmlforSubgrid = function (subgrid_id, row_id) {...}),并在函数体的第一行中定义所有变量。 JavaScript具有像大多数计算机语言一样的无块级变量声明,因此如果要在JavaScript代码中定义变量,则很容易产生错误的代码。

最后一条建议是对JavaScript代码使用Kernighan and Ritchie's style代码格式,而不依赖于您最喜欢的计算机语言中使用的样式。它会阻止您从Automatic Semicolon Insertion发现可能导致难以定位的严重错误。