代码之家  ›  专栏  ›  技术社区  ›  sipsorcery

jqgrid需要在“添加”对话框中可编辑的字段,但不需要在“编辑”对话框中编辑。

  •  3
  • sipsorcery  · 技术社区  · 14 年前

    我正在尝试在我的ASP.NET MVC应用程序中使用jqgrid,并要求某些列在“添加”对话框中可编辑,但在“编辑”对话框中不可编辑。显然,这样做的方法是使用beforeShowFormjavascript事件并在特定的输入字段上设置属性。

    到目前为止,我还没办法让BeforeShowForm事件启动。下面是我在另一篇文章中找到的一个例子 SO question 但到目前为止,我还没能让它发挥作用。我错过了什么把戏吗?我使用的是最新的3.8版本的jqgrid。

    控制器:

     [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}
                  }
              }
         }
    }
    

    观点:

    function initGrid() {
    
      jQuery("#myGrid").jqGrid('navGrid','#myGrid-pager',
                { }, //options
                { // edit options
                    beforeShowForm: function(frm) {
                        alert("beforeShowForm edit");
                    }
                },
                { // add options
                    beforeShowForm: function(frm) {
                        alert("beforeShowForm add");
                    }
                },
                { }, // del options
                { } // search options
            );
    }
    
    <div>           
        <%= Html.Trirand().JQGrid(Model.MyGrid, "myGrid") %>
    </div>
    
    3 回复  |  直到 11 年前
        1
  •  3
  •   Community CDub    7 年前

    在我看来,你的问题的答案 here here (另请看示例)。

    更新的 :我不知道jqgrid的商业版本。如果你不解决你的问题,你应该把你的问题更好地张贴在论坛上。 http://www.trirand.net/forum/default.aspx .

    如果我理解您的代码正确,您可以尝试删除属性的定义。 readonly disabled ( JQGridEditFieldAttribute )来自 EditFieldAttributes . 你可以尝试做以下的事情

    如果要在“编辑”对话框中显示只读字段“用户名”和“域”,可以执行以下操作

    jQuery("#myGrid").jqGrid('navGrid','#myGrid-pager',
                             { }, //options
                             { recreateForm: true, // edit options
                               beforeShowForm: function(form) {
                                   $('#username',form).attr('readonly','readonly');
                                   $('#domain',form).attr('readonly','readonly');
                               }
                             });
    

    或者不使用 recreateForm: 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', ...); . 看 http://www.trirand.net/documentation/aspnet/_2s20v9uux.htm http://www.trirand.com/blog/phpjqgrid/docs/jqGrid/jqGridRender.html#methodsetNavOptions

        2
  •  3
  •   sipsorcery    14 年前

    我最终购买了付费版本的jqgrid——与javascript相比,我能够使用干净的.NET对象模型节省的时间将在很短的时间内为自己付出代价。

    这个问题的答案直接来自Trirand的支持。

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

    模型:

    JQGrid1.ClientSideEvents.AfterEditDialogShown="disableFields";
    JQGrid1.ClientSideEvents.AfterEditDialogShown="enableFields";
    

    观点:

    <script type="text/javascript">
    
        function disableFields() {
            //jQuery("#fieldname").attr("disabled", "disabled");
            $("#Source").attr("disabled", "true");
            $("#ProgramName").attr("disabled", "true");
            $("#Division").attr("disabled", "true");
            $("#Medium").attr("disabled", "true");
            $("#content").attr("disabled", "true");
        }
    
        function enableFields() {
            $("#Source").attr("disabled", "false");
            $("#ProgramName").attr("disabled", "false");
            $("#Division").attr("disabled", "false");
            $("#Medium").attr("disabled", "false");
            $("#content").attr("disabled", "false");
        }
    
    </script>
    
        3
  •  0
  •   Aquiles    11 年前

    当前解决方案:jqgrid 4.5.4-jquery grid

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

    if (rowid === "new") {
        rowid = "_empty";
        frmoper = "add";
        p.caption=rp_ge[$t.p.id].addCaption;
    } else {
         p.caption=rp_ge[$t.p.id].editCaption;
         frmoper = "edit";
    }
    

    我把这个修改

    $t.p.custom_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元素不能与这个线程中的当前解决方案一起工作。