jqGrid需要一个在添加对话框上可编辑的字段,但不需要编辑对话框
我试图在我的ASP.NETMVC应用程序中使用jqGrid,要求某些列在“添加”对话框中可编辑,但在“编辑”对话框中不可编辑。显然,实现这一点的方法是使用beforeShowForm javascript事件并设置特定输入字段的属性 到目前为止,我无法成功启动beforeShowForm事件。下面是我在另一个网站上找到的一个例子,但到目前为止,我还没有成功地让它工作。我错过了什么把戏吗?我正在使用jqGrid的最新3.8版本 控制器:jqGrid需要一个在添加对话框上可编辑的字段,但不需要编辑对话框,jqgrid,asp.net-mvc,Jqgrid,Asp.net Mvc,我试图在我的ASP.NETMVC应用程序中使用jqGrid,要求某些列在“添加”对话框中可编辑,但在“编辑”对话框中不可编辑。显然,实现这一点的方法是使用beforeShowForm javascript事件并设置特定输入字段的属性 到目前为止,我无法成功启动beforeShowForm事件。下面是我在另一个网站上找到的一个例子,但到目前为止,我还没有成功地让它工作。我错过了什么把戏吗?我正在使用jqGrid的最新3.8版本 控制器: [Authorize] public ActionRes
[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的代码(代码越多越好),并描述您希望允许在添加对话框中编辑的字段。我已经解释了我的代码示例。用户名和域字段是我希望能够在添加屏幕上使用的字段,而不是在编辑屏幕上使用的字段。