jqGrid需要一个在添加对话框上可编辑的字段,但不需要编辑对话框

jqGrid需要一个在添加对话框上可编辑的字段,但不需要编辑对话框,jqgrid,asp.net-mvc,Jqgrid,Asp.net Mvc,我试图在我的ASP.NETMVC应用程序中使用jqGrid,要求某些列在“添加”对话框中可编辑,但在“编辑”对话框中不可编辑。显然,实现这一点的方法是使用beforeShowForm javascript事件并设置特定输入字段的属性 到目前为止,我无法成功启动beforeShowForm事件。下面是我在另一个网站上找到的一个例子,但到目前为止,我还没有成功地让它工作。我错过了什么把戏吗?我正在使用jqGrid的最新3.8版本 控制器: [Authorize] public ActionRes

我试图在我的ASP.NETMVC应用程序中使用jqGrid,要求某些列在“添加”对话框中可编辑,但在“编辑”对话框中不可编辑。显然,实现这一点的方法是使用beforeShowForm javascript事件并设置特定输入字段的属性

到目前为止,我无法成功启动beforeShowForm事件。下面是我在另一个网站上找到的一个例子,但到目前为止,我还没有成功地让它工作。我错过了什么把戏吗?我正在使用jqGrid的最新3.8版本

控制器:

 [Authorize]
 public ActionResult Index()
 {
      var gridModel = new MyGridModel();
      SetUpGrid(gridModel.MyGrid);
      return View(gridModel);
 }

 private void SetUpGrid(JQGrid grid)
 {
        grid.DataUrl = Url.Action("GridDataRequested");
        grid.EditUrl = Url.Action("EditRows");
        grid.ToolBarSettings.ShowSearchToolBar = false;

        grid.ToolBarSettings.ShowEditButton = true;
        grid.ToolBarSettings.ShowAddButton = true;
        grid.ToolBarSettings.ShowDeleteButton = true;
        grid.ToolBarSettings.ShowRefreshButton = true;
        grid.EditDialogSettings.CloseAfterEditing = true;
        grid.AddDialogSettings.CloseAfterAdding = true;

        grid.EditDialogSettings.Modal = false;
        grid.EditDialogSettings.Width = 500;
        grid.EditDialogSettings.Height = 300;

        grid.ClientSideEvents.GridInitialized = "initGrid";
 }
型号:

public class MyGridModel
{
    public JQGrid MyGrid { get; set; }

    public MyGridModel()
    {
      MyGrid = new JQGrid
      {
        Columns = new List<JQGridColumn>()
        {
            new JQGridColumn { DataField = "id", 
                               PrimaryKey = true,
                               Visible = false,
                               Editable = false },
            new JQGridColumn { DataField = "username", 
                               Editable = true,
                               EditFieldAttributes = new List<JQGridEditFieldAttribute>()
                               {
                                     new JQGridEditFieldAttribute(){ Name = "readonly", Value = "true"},
                                     new JQGridEditFieldAttribute(){ Name = "disabled", Value = "true"}
                                },
                                Width = 100},
            new JQGridColumn { DataField = "domain", 
                               Editable = true,
                               EditFieldAttributes = new List<JQGridEditFieldAttribute>()
                               {
                                    new JQGridEditFieldAttribute(){ Name = "readonly", Value = "true"},
                                    new JQGridEditFieldAttribute(){ Name = "disabled", Value = "true"}
                                },
                                Width = 100}
              }
          }
     }
}
JQGrid1.ClientSideEvents.AfterEditDialogShown="disableFields";
JQGrid1.ClientSideEvents.AfterEditDialogShown="enableFields";
公共类MyGridModel
{
公共JQGrid MyGrid{get;set;}
公共MyGridModel()
{
MyGrid=newjqgrid
{
列=新列表()
{
新的JQGridColumn{DataField=“id”,
PrimaryKey=true,
可见=假,
可编辑=假},
新的JQGridColumn{DataField=“username”,
可编辑=真,
EditFieldAttributes=新列表()
{
新的JQGridEditFieldAttribute(){Name=“readonly”,Value=“true”},
新建JQGridEditFieldAttribute(){Name=“disabled”,Value=“true”}
},
宽度=100},
新的JQGridColumn{DataField=“domain”,
可编辑=真,
EditFieldAttributes=新列表()
{
新的JQGridEditFieldAttribute(){Name=“readonly”,Value=“true”},
新建JQGridEditFieldAttribute(){Name=“disabled”,Value=“true”}
},
宽度=100}
}
}
}
}
视图:

函数initGrid(){
jQuery(“#myGrid”).jqGrid('navGrid','#myGrid pager',
{},//选项
{//编辑选项
beforeShowForm:功能(frm){
警报(“显示前编辑”);
}
},
{//添加选项
beforeShowForm:功能(frm){
警报(“显示前表格添加”);
}
},
{},//删除选项
{}//搜索选项
);
}

在我看来,您将找到您的问题的答案,并且(同时查看示例)

更新:我不知道jqGrid的商业版本。如果你不能解决你的问题,你应该在论坛上更好地发布你的问题

如果我对代码的理解正确,您可以尝试从
editfieldtributes
中删除属性
readonly
disabled
jqgrideditfieldtribute
)的定义。相反,你可以试着做以下事情

jQuery("#myGrid").jqGrid('navGrid','#myGrid-pager',
                         { }, //options
                         { recreateForm: true, // edit options
                           beforeShowForm: function(form) {
                               $('#username',form).attr('readonly','readonly');
                               $('#domain',form).attr('readonly','readonly');
                           }
                         });
如果要在编辑对话框中显示只读字段“用户名”和“域”,可以执行以下操作

jQuery("#myGrid").jqGrid('navGrid','#myGrid-pager',
                         { }, //options
                         { recreateForm: true, // edit options
                           beforeShowForm: function(form) {
                               $('#username',form).attr('readonly','readonly');
                               $('#domain',form).attr('readonly','readonly');
                           }
                         });
或者不使用
重新创建表单:true
选项:

jQuery("#myGrid").jqGrid('navGrid','#myGrid-pager',
                         { }, //options
                         { // edit options
                           beforeShowForm: function(form) {
                               $('#username',form).attr('readonly','readonly');
                               $('#domain',form).attr('readonly','readonly');
                           }
                         },
                         { // add options
                           beforeShowForm: function(frm) {
                               $('#username',form).removeAttr('readonly');
                               $('#domain',form).removeAttr('readonly');
                           }
                         });
如果不想在编辑对话框中显示“用户名”和“域”字段,可以这样做

jQuery("#myGrid").jqGrid('navGrid','#myGrid-pager',
                         { }, //options
                         { recreateForm: true, // edit options
                           beforeShowForm: function(form) {
                               $('#username',form).hide();
                               $('#domain',form).hide();
                           }
                         });
它应该在jqGrd的免费版本中工作,但因为您使用了
SetUpGrid
来设置jqGrid导航栏的一些设置(如
grid.ToolBarSettings.ShowEditButton=true
)。你也用

grid.ClientSideEvents.GridInitialized = "initGrid"

我不确定在
initGrid
函数中可以做什么。也许您应该定义一些额外的回调,而不是调用
jQuery(“#myGrid”).jqGrid('navGrid',…)。看看,我最终购买了付费版本的jqGrid——与javascript相比,我能够使用干净的.Net对象模型节省的时间很快就能为自己买单

Trirand support直接对此问题的答案是

您可以使用客户端事件AfterEditDialogShowed和AfterAddDialogShowed来禁用/启用这两个对话框的编辑字段。用于编辑/添加的字段将具有与数据字段相同的ID(区分大小写)。例如:

型号:

public class MyGridModel
{
    public JQGrid MyGrid { get; set; }

    public MyGridModel()
    {
      MyGrid = new JQGrid
      {
        Columns = new List<JQGridColumn>()
        {
            new JQGridColumn { DataField = "id", 
                               PrimaryKey = true,
                               Visible = false,
                               Editable = false },
            new JQGridColumn { DataField = "username", 
                               Editable = true,
                               EditFieldAttributes = new List<JQGridEditFieldAttribute>()
                               {
                                     new JQGridEditFieldAttribute(){ Name = "readonly", Value = "true"},
                                     new JQGridEditFieldAttribute(){ Name = "disabled", Value = "true"}
                                },
                                Width = 100},
            new JQGridColumn { DataField = "domain", 
                               Editable = true,
                               EditFieldAttributes = new List<JQGridEditFieldAttribute>()
                               {
                                    new JQGridEditFieldAttribute(){ Name = "readonly", Value = "true"},
                                    new JQGridEditFieldAttribute(){ Name = "disabled", Value = "true"}
                                },
                                Width = 100}
              }
          }
     }
}
JQGrid1.ClientSideEvents.AfterEditDialogShown="disableFields";
JQGrid1.ClientSideEvents.AfterEditDialogShown="enableFields";
视图:


函数disableFields(){
//jQuery(“#fieldname”).attr(“disabled”、“disabled”);
$(“#Source”).attr(“disabled”、“true”);
$(“#程序名”).attr(“已禁用”、“真实”);
美元(“#部门”).attr(“残疾”、“真实”);
$(“#中”).attr(“禁用”、“真实”);
$(“#内容”).attr(“禁用”、“真实”);
}
函数启用字段(){
$(“#来源”).attr(“禁用”、“错误”);
$(“#程序名”).attr(“禁用”、“错误”);
$(“#部门”).attr(“禁用”、“错误”);
$(“#中”).attr(“禁用”、“错误”);
$(“#内容”).attr(“禁用”、“错误”);
}

当前解决方案:jqGrid 4.5.4-jQuery网格

在editGridRow的这行之后(第7447行)

我把这个修改

$t.p.custom\u frmoper=frmoper

然后我可以决定在弹出编辑和弹出添加中使用元素做什么

$.ajax($.extend({
   url: $.isFunction(options.dataUrl) ? options.dataUrl.call($t, rowid, vl, String(options.name)) :      options.dataUrl,
   type : "GET",
   dataType: "html",
   data: $.isFunction(postData) ? postData.call($t, rowid, vl, String(options.name)) : postData,
   context: {elem:elem, options:options, vl:vl},
   success: function(data){
       var ovm = [], elem = this.elem, vl = this.vl,
       options = $.extend({},this.options),
       msl = options.multiple===true,
       a = $.isFunction(options.buildSelect) ? options.buildSelect.call($t,data) : data;
       if(typeof a === 'string') {
           a = $( $.trim( a ) ).html();
       }
       if(a) {
           $(elem).append(a);
           setAttributes(elem, options, postData ? ['postData'] : undefined);

// CUSTOM CODE

    $.each($t.p.colModel, function (i, current) {
        if (current.not_editable) {
           if ($t.p.custom_frmoper == 'edit') {
           $("#" + current.name).attr('readonly', 'readonly');
           $("#" + current.name).attr('disabled', 'disabled');
           }
           else {
           $("#" + current.name).removeAttr('readonly');
           $("#" + current.name).removeAttr('disabled');
           }
        }
    });
我还向列模型添加了一个自定义的不可编辑属性,以确定特定列在添加时是可编辑的,在修改时是只读的

{ name: 'ID', index: 'ID', not_editable: true }

我希望有帮助。我之所以创建此修改,是因为SELECT元素不适用于此线程中的当前解决方案。

它们是我一直尝试使用但无效的示例。在我上面的示例中,您知道“navGrid”和“myGrid pager”指的是什么吗?@sipwiz:您应该在问题中包含定义jqGrid的代码(代码越多越好),并描述您希望允许在添加对话框中编辑的字段。我已经解释了我的代码示例。用户名和域字段是我希望能够在添加屏幕上使用的字段,而不是在编辑屏幕上使用的字段。