【问题标题】:Kendo Grid Filtering on integer column整数列上的剑道网格过滤
【发布时间】:2016-08-18 06:05:08
【问题描述】:

我有一个包含多列的网格。 说Id(integer)Name(string)等。 更改事件对于名称列工作正常。但对于 ID 列它不起作用(更改事件未触发 kendo 中的数字列)。

我已经完成了客​​户端脚本。但我希望此功能位于服务器端(Razor)。

我是 Kendo UI 的新手,非常感谢任何有关如何执行此操作的帮助。

我在下面附上我的代码:

@(Html.Kendo().Grid(Model).Name("ViewDataGrid")

                            .Columns(columns =>
                            {
                                columns.Bound(c => c.Id).Title(" ID").Width(150);
                                columns.Bound(c => c.Name).Title(" Name").Width(150);

                            })
                            .HtmlAttributes(new { style = "height: auto; width: 2200px" })
                            .Filterable(i => i.Mode(GridFilterMode.Menu | GridFilterMode.Row))

                            .Sortable(s => s.AllowUnsort(false).SortMode(GridSortMode.MultipleColumn))
                            .Selectable(selecting => selecting.Enabled(true))                               
                            .Pageable(r => r.PreviousNext(true).PageSizes(new int[] { 10, 20, 30, 40, 50, 100 }))
                            .DataSource(dataSource => dataSource
                            .Ajax()
                            .PageSize(20)
                            .ServerOperation(false)
                            .Events(e => e.Change("call"))


))


function call(e) {

        debugger;

                var filterlength = e.sender.filter.arguments[0].filters.length;
                var ds = $("#ViewDataGrid").data("kendoGrid");
                $filter = new Array();

                for (var i = 0; i < filterlength; i++) {
                    if (e.sender.filter.arguments[0].filters[i].field == "Id")
                        $filter.push({ field: e.sender.filter.arguments[0].filters[0].field, operator: "eq", value: parseInt(e.sender.filter.arguments[0].filters[0].value) });
                    else
                        $filter.push({ field: e.sender.filter.arguments[0].filters[0].field, operator: "contains", value: e.sender.filter.arguments[0].filters[0].value });
                }

                $("#ViewDataGrid").data("kendoGrid").dataSource._filter = $filter;
                $("#ViewDataGrid").data("kendoGrid").dataSource.sync();         



        }

模型.CS

   public int Id { get; set; }

    public string Name { get; set; }

控制器

 public ActionResult Index()
    {
        List<GridData> dataList = new List<GridData>(); 
    GridData data1 = new GridData();
        data1.Id = 9191919;
        data1.Name = "XYZ";           
        dataList.Add(data1);
        return View(dataList);           
    }

编辑后: 更改事件未触发。 你能帮我解决我的问题吗?

@(Html.Kendo().Grid(Model)
.Name("ViewDataGrid")
.ToolBar(toolBar =>
{
toolBar.Template(
    @<Text>
    <input type="search" id="searchBox" class="SearchRight SearchTopMargin" />
    <b class="FloatRight SearchTopMarginExtra">Search the grid: </b>
    </Text>);
})

.HtmlAttributes(new { style = "height: auto; width: 2200px" }) .Filterable(i => i.Mode(GridFilterMode.Menu | GridFilterMode.Row))

                            .Sortable(s => s.AllowUnsort(false).SortMode(GridSortMode.MultipleColumn))
                            .Selectable(selecting => selecting.Enabled(true))
                            .Events(e => e.Change("call"))
                            .Pageable(r => r.PreviousNext(true).PageSizes(new int[] { 10, 20, 30, 40, 50, 100 }))
.DataSource(dataSource => dataSource
    .Custom()
    .Type("aspnetmvc-ajax")
    .PageSize(20)
    .ServerPaging(false)
    .ServerSorting(false)
    .ServerFiltering(false)
    .Transport(transport => transport
        .Read(read => read.Action("Read", "Index"))
    )
    .Schema(schema => schema
        .Data("Data")
        .Total("Total")
        .Errors("Errors")
        .Model(model =>
        {
            model.Id("Id");
            model.Field("Id", typeof(int));
            model.Field("Name", typeof(string));

        })

    )
)

)

【问题讨论】:

  • 请分享您的代码。
  • 您的数据源设置/配置如何?
  • 我们只是从控制器传递静态数据。请同时找到控制器代码。
  • 好吧,这可能是一个长镜头,但这最终为我做了,而不是直接传递数据源,我最终还在数据源的配置中指定了“模式”。我遵循了 Telerik 的自定义数据源 API 参考:docs.telerik.com/kendo-ui/aspnet-mvc/custom-datasource。希望对你有帮助
  • 如果我喜欢这个剑道网格更改事件不会触发。请帮帮我。

标签: javascript jquery asp.net-mvc kendo-grid


【解决方案1】:

您好,我可能有一个解决方案,如果这对您有用,请告诉我:

剃刀

@(Html.Kendo().Grid(Model).Name("ViewDataGrid")
    .Columns(columns =>
    {
        columns.Bound(c => c.Id).Title(" ID").Width(150);
        columns.Bound(c => c.Name).Title(" Name").Width(150);
    })
    .HtmlAttributes(new { style = "height:550px;" })
    .Filterable(i => i.Mode(GridFilterMode.Menu | GridFilterMode.Row))
    .Sortable(s => s.AllowUnsort(false).SortMode(GridSortMode.MultipleColumn))
    .Selectable(selecting => selecting.Enabled(true))                               
    .Pageable(r => r.PreviousNext(true).PageSizes(new int[] { 10, 20, 30, 40, 50, 100 }))
    .Events(events => events.DataBound("call")) // try to bound the event
    .DataSource(dataSource => dataSource
            .Ajax()
            .PageSize(20)
            .ServerPaging(false)
            .ServerSorting(false)
            .ServerFiltering(false)
            .Read(read => read.Action("Read", "Index"))
    )
)

JAVASCRIPT

<script>
    function call(e) {

        //debugger;
        //console.log(e) //Log e and look through the object data.

        var filterlength = e.sender.filter.arguments[0].filters.length;
        var ds = $("#ViewDataGrid").data("kendoGrid");
        $filter = new Array();

        for (var i = 0; i < filterlength; i++) {
            if (e.sender.filter.arguments[0].filters[i].field == "Id")
                $filter.push({ field: e.sender.filter.arguments[0].filters[0].field, operator: "eq", value: parseInt(e.sender.filter.arguments[0].filters[0].value) });
            else
                $filter.push({ field: e.sender.filter.arguments[0].filters[0].field, operator: "contains", value: e.sender.filter.arguments[0].filters[0].value });
        }

        $("#ViewDataGrid").data("kendoGrid").dataSource._filter = $filter;
        $("#ViewDataGrid").data("kendoGrid").dataSource.sync();         
    }
</script>

如果这不起作用,那么可能会有某种解决方法。也许尝试使用您的初始实现:尝试解析或使用 ID 列“c.Id”作为字符串并以与名称字段“c.Name”相同的方式处理它,例如:

e.sender.filter.arguments[0].filters[0].value.toString()

这可能不是最好的解决方法,但如果您已经尝试过,我相信一定有另一种方法。您可能会发现此 API 参考也很有用:

Kendo.Mvc.UI.Fluent GridBuilder aspnet-mvc

我仍然会在我这边调查这个问题,尝试复制问题,如果我碰巧找到任何东西,我会立即更新我的帖子/答案。

祝你好运。

【讨论】:

  • 现在我又面临一个问题。我有 o 动态传递过滤器运算符。在现有功能中,即使我选择了“不包含”,它也会返回包含运算符的结果。请帮我。 $filter.push({ field: e.sender.filter.arguments[0].filters[0].field, operator: "contains", value: e.sender.filter.arguments[0].filters[0].价值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多