KendoUI表格编辑弹出窗口,如何隐藏字段。

24

在编辑弹出窗口中隐藏一个字段但在网格本身中仍应可见的方法是否存在?

我尝试将其设置为hidden:true,但是kendo似乎忽略了它。 当editable设置为false时,它会隐藏文本框,但字段标签仍然显示。 是否可能同时删除标签和文本框?

我的数据源:

schema: {
    total: "Total",
    data: "Data",
    model:{
        id:"Id",
        fields:{
            Id:{ visible: false, editable:false },
            Name:{ editable:true },
            NumberOfUsers:{ hidden:true, editable:false }
        }
    }
}
15个回答

24

类似的解决方案对我也有效:

edit: function(e) {
    e.container.find(".k-edit-label:first").hide();
    e.container.find(".k-edit-field:first").hide();
},

2
这个答案更准确。 - Isilmë O.
3
“你为什么问‘更准确’?”弹出窗口中,“k-edit-label”和“k-edit-field”是具有类“k-edit-form-container”的父级“div”的前两个子元素。使用自定义模板,无法保证第一个“input”就是您要隐藏的内容!由于第一个“input”(或任何模板想要的内容)位于第一个“k-edit-field” div内,因此此答案的选择器具有较少的边缘情况。您还可以使用jQuery的“:eq(n)”零索引选择器来隐藏第三个标签和字段(请注意“或”选择器):“e.container.find(".k-edit-label:eq(2), .k-edit-field:eq(2)").hide();” - ruffin

18

"hidden: true" 这个选项不存在,因此它被忽略了。您可以使用网格的编辑事件来从弹出窗口中隐藏某些元素:

$("#grid").kendoGrid({
  edit: function(e) {
     e.container.find("input:first").hide();
  }
});

14
如果您正在使用 ASP.NET MVC 中的 Html.Kendo().Grid<>(),则应该执行以下操作:

将编辑事件处理程序添加到您的控件属性中的.Events中,如下所示:

.Events(e => e.Edit("hideIdField"))

其中 "hideIdField" 是您的 JavaScript 事件处理程序函数。

EventHandlers.js 中,添加此函数:

function hideIdField(e) {
    $("#ProductID").hide();
    $("label[for='ProductID']").hide();
}  

其中ProductID是从源模型中选择的Id字段的名称。


7
要隐藏一个字段,只需在视图模型中添加以下内容:[ScaffoldColumn(false)] - Azarsa

13

我喜欢@jfl提供的答案,并且将这个想法扩展到一个好的、可重用的设置中非常有用。

为什么呢?保持需要隐藏的列的顺序很脆弱。也就是说,@jfl的答案只适用于第一个字段集/列,即使是我在快速评论中的版本,也要求顺序和潜在的列数不改变。

相反,您可以通过在列的声明中放置一个属性来标准化如何隐藏列,然后在显示弹出窗口后调用的edit事件处理程序中检查它。您可以在edit事件中获得对完整columns声明的引用,因此我们具有很大的灵活性。

我在这个演示中提供了一个完整的示例,但以下是简要说明:

我在列声明中添加了一个hideMe属性:

columns: [
    { field: "name" },
    { field: "position" },
    {
        field: "age",
        hideMe: true              // <<< This is new.
    },
    { command: "edit" }
],

接着前面提到的回答和评论,我在我的edit处理程序中加入了以下内容:

e.sender.columns.forEach(function (element, index /*, array */) {
    if (element.hideMe) {
        e.container.find(".k-edit-label:eq(" + index + "), "
            + ".k-edit-field:eq( " + index + ")"
        ).hide();
    }
});

不再需要跟踪列序号。只需更改具有hideMe的内容即可添加列,更改顺序,隐藏新列等操作。(回顾过去,我可能应该将其称为hideMeOnEdit,但您明白我的意思。)


7
为了隐藏一个字段,只需将以下内容添加到视图模型中:
[ScaffoldColumn(false)] 
public int Id { get; set; }

如果您想保留字段并仅隐藏它,请按照以下步骤操作:

@(Html.Kendo().Grid<ViewModel>()
.Name("grid")
.Columns(columns =>
{
    columns.Bound(m => m.Id).Hidden()
    columns.Bound(m => m.Name)
}))

1
这会将其隐藏在网格之外,这不是 OP 想要的。 - pfeds

5

类似的解决方案对我也起作用:

edit: function(e) {
    e.container.find("label[for=yourFieldName]").parent("div .k-edit-label").hide();
    e.container.find("label[for=yourFieldName]").parent().next("div .k-edit-field").hide();
},

3
例如,有一个名为PK_的字段:
 edit: function(e) {

    e.container.find("input[name='PK_']").hide();
    e.container.find("label[for='PK_']").hide();
}

3
如果您正在使用ASP.NET MVC的UI,您可以使用以下方法,不仅可以隐藏控件本身,还可以隐藏占用前端空间的FirstParent div。
添加事件处理程序。
Html.Kendo().Grid<ProductDTO>()
        .Name("GRVProducts")
        .Columns(c =>
            {     
                c.Bound(p => p.ProductID);
                c.Bound(p => p.Name);
                c.Bound(p => p.Price);                
            }
        )
        .Events(events=> events.Edit("HideGridFields"))

添加Javascript代码

<script type="text/javascript">
    function HideGridFields(e)
    {
        HideControl("ProductID", e); //Hide ProductID control with Label and parent tag. No space occupied ;)
    }

    function HideControl(fieldName, e)
    {
        var cont = $(e.container);
        HideFieldLabel(cont.find("label[for='"+fieldName+"']"));
        HideFieldField(cont.find("#" +fieldName));
    }

    function HideFieldLabel(control)
    {
        control.parent(".editor-label").hide();
    }

    function HideFieldField(control) {
        control.parent(".editor-field").hide();
    }
</script>

使用标签和父元素隐藏ProductID控件。前端不占用任何空间;)


1
创建一个如下所示的函数:
function noEditor(container, options) {
    container.prevObject.find("div[data-container-for='" + options.field + "']").hide();
    container.prevObject.find("label[for='" + options.field + "']").parent().hide();
}

然后在你的字段中,将editor属性设置如下:

columns: [
    { field: "Field1", title: "Field 1", editor: noEditor },
    { field: "Field2", title: "Field 2" },
    { field: "Field3", title: "Field 3" },
    { field: "Field4", title: "Field 4", editor: noEditor }
]

这样,您可以轻松地在弹出式编辑器中隐藏多个字段。在此示例中,Field1Field2Field3Field4将显示在网格中,但Field1Field4不会显示在弹出式编辑器中。

1
不要忘记在模型上使用数据注释的选项:
[HiddenInput(DisplayValue = false)]

(如果您的模型基于ASP.NET MVC)

请参考如何撰写一个好的回答,并在您的回答中提供一些细节。 - Tom M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接