工具栏上带有自动完成功能的 kendoui Grid?

Posted

技术标签:

【中文标题】工具栏上带有自动完成功能的 kendoui Grid?【英文标题】:kendoui Grid with autocomplete on its toolbar? 【发布时间】:2013-03-22 15:10:15 【问题描述】:

更新: 我尝试并花了很多时间来解决这个问题,最后问题解决了。 但最初非常感谢 OnaBai 和帮助我走到今天这一步的同事。

现在我被困在这里了。

我输入用户名,它会在下拉菜单中显示,按 TAB 或 ENTER 后,它会在网格中显示结果。 结果仅在来自页面“1”的情况下显示在网格中,但如果来自页面“2”或任何其他页面,则不显示结果。

这是它的工作原理:

但是当我搜索不在第 1 页上的其他用户时,它不会显示在网格中显示其他用户。相反,我得到空网格。

FireBug 截图:

这是我对代码进行了更多更改后的更新代码。:

  <?php
/*foreach($users_list_data->result() as $row)
    echo $row->Username."<br />";
*/
?>

<div id="grid"></div>
    <div id="details" />
    <div class="second_column_content_container">
    </div>



<script>

function create_user() 

    var entryform = $("#insert_user_info");
    $.ajax(
        type : 'POST',
        url : '<?php echo base_url(); ?>/index.php/user_management/manage_users/createUser',
        data : entryform.serialize(),
        success : function(response) 
            $(".second_column").html(response);
        
    );


function create_user_form() 


    $.ajax(
        type : 'POST',
        url : '<?php echo base_url(); ?>/index.php/user_management/manage_users/load_user_form',

        success : function(response) 
            $(".second_column").html(response);
        
    );


function onChange(arg) 



        var selected = "";
        var grid = this;

        grid.select().each(function() 
            var dataItem = grid.dataItem($(this));
            selected = dataItem.Username;
        );

  $.ajax(
        type: "POST",
        url: "<?php echo base_url()?>index.php/user_management/manage_users/get_user_groups/"+selected,

        beforeSend: function()


            $("#pre_image").attr("src","http://localhost/zorkif_new/images/pre.gif");

        ,

        success: function(output_string) 


            $('.data_column_a').html(output_string);

        
    );
 


    var wnd, detailsTemplate;
    $(document).ready(function()
        var serverBaseUrl = "<?php echo base_url(); ?>";
        $("#grid").kendoGrid(
            dataSource:
                serverPaging: true,
                transport: 
                    read: serverBaseUrl + "index.php/user_management/manage_users/list_view/",
                    update: 
                        url: serverBaseUrl + "index.php/user_management/manage_users/userUpdate/",
                        type: "POST"
                    
//                    destroy: 
//                        url: serverBaseUrl + "index.php/user_management/manage_users/userDelete/",
//                        dataType: "jsonp"
//                    
                    //update: "<?php echo base_url() ?>index.php/user_management/manage_users/list_view/"
                ,
                error: function(e) 
                    alert(e.responseText);
                ,
                schema:
                    data: "data",
                    total: "total",
                    model: 
                        id: "UserID",
                        fields: 
                            FirstName:  editable: true ,
                            LastName:  validation:  required: true ,
                            MiddleNames:validation:required:true
                        
                    
                ,
                pageSize:5

            ,
            toolbar: kendo.template($("#toolbarTemplate").html()),
            scrollable: true,

            selectable: "row",
            sortable: true,
            filterable: true,
            pageable: 
                input: true,
                numeric: false
            ,
            columns: [
                
                    field: "UserID",
                    hidden:true
                ,
                
                    field: "Username",
                    title:"Username"
                ,
                 field: "FirstName",
                    title:"First Name"
                ,
                field:"MiddleNames",
                field:"LastName",
                field:"City",
                field:"Email",
                //field:"Actions",
                //command:  text: "Delete", click: showDetails , title: " ", width: "140px",
                command:  text: "Details", click: redirectToPage , title: " ", width: "140px" ,
                 command:  text: "Edit", click: redirectToEditPage , title: "&nbsp;", width: "140px" 
            ],
            change: onChange,
            editable: "popup"
        );
        $("#users").kendoAutoComplete(
            minLength: 3,
            dataTextField: "Username",
            dataSource: 
                serverFiltering: true,
                transport: 
                    read: 
                        type: "GET",
                        dataType: "json",
                        contentType:'application/json; charset=utf-8',
                        url: serverBaseUrl + "index.php/user_management/manage_users/search_user/",
                        data: function (arg)
                            //alert(arg);
                            //alert(Username:autocompleteUsers.data("kendoAutoComplete").value);
                               return Username : $("#users").data("kendoAutoComplete").value();
                            //return $("#users").data("kendoAutoComplete").value();
                            
                    
                
            ,
            change: onChangeAutoComplete
        );

        function onChangeAutoComplete()
            var value = this.value();
            var grid = $('#grid');
            if (value) 
                grid.data("kendoGrid").dataSource.filter( field: "Username", operator: "Contains", value: value );
             else 
                grid.data("kendoGrid").dataSource.filter();
            
        
        /*$("#users").kendoAutoComplete(
            minLength: 3,
            dataTextField: "Title",
            //JSON property name to use
            dataSource: 
                pageSize: 10,
                //Limits result set
                transport: 
                    read: 
                        url: "/echo/json/",
                        //using jsfiddle echo service to simulate JSON endpoint
                        dataType: "json",
                        type: "POST",
                        data: 
                            // /echo/json/ echoes the JSON which you pass as an argument
                            json: JSON.stringify([
                                
                                    "Title": "Doctor Who: The Trial of a Time Lord",
                                
                                    "Title": "Doctor Who: The Key to Time",
                                
                                    "Title": "Doctor Who: The Time Meddler",
                                
                                    "Title": "Doctor Who: The End of Time"
                            ])
                        
                    
                
            
        );*/

        /*change: function () 
                var value = this.value();
                if (value) 
                    grid.data("kendoGrid").dataSource.filter( field: "UserID", operator: "eq", value: value );
                 else 
                    grid.data("kendoGrid").dataSource.filter();
                
            
        );*/
        /*$("#users").blur(function() 
            var data = $(this).data("kendoAutoComplete").dataSource._data,
                    nbData = data.length,
                    found = false;

            for(var iData = 0; iData < nbData; iData++) 
                if(this.value === data[iData].Title)
                    found = true;
            
            console.log(found);
        );*/

        wnd = $("#details").kendoWindow(
                    title: "Customer Details",
                    modal: true,
                    visible: false,
                    resizable: false,
                    width: 300
                ).data("kendoWindow");
        detailsTemplate = kendo.template($("#template").html());

    );

    function redirectToPage(e)
        e.preventDefault();
        var row = $(e.target).closest("tr");
        var item = $("#grid").data("kendoGrid").dataItem(row);
        $.ajax(
            type: "POST",
            url: "<?php echo base_url().'index.php/user_management/manage_users/ViewProfile/'?>"+JSON.parse(item.UserID),
            success: function(output_string)
                $('.second_column_content_container').html(output_string);
                //$('.second_column_content_container').innerHTML("hello");
                //alert(output_string);
            ,
            error: function(data)
                alert("error");
            
        );
    
    function redirectToEditPage(e)
        e.preventDefault();
        var row = $(e.target).closest("tr");
        var item = $("#grid").data("kendoGrid").dataItem(row);
        $.ajax(
            type: "POST",
            url: "<?php echo base_url().'index.php/user_management/manage_users/edit_user/'?>"+JSON.parse(item.UserID),
            success: function(output_string)
                $('.second_column_content_container').html(output_string);
                //$('.second_column_content_container').innerHTML("hello");
                //alert(output_string);
            ,
            error: function(data)
                alert("error");
            
        );
    
        //show details on a popup
       function showDetailsPopup(e) 
        e.preventDefault();
        var dataItem = this.dataItem($(e.currentTarget).closest("tr"));
        wnd.content(detailsTemplate(dataItem));
        wnd.center().open();
    

    //This will redirect to Next Page
    function showDetails(e) 
        e.preventDefault();
        var row = $(e.target).closest("tr");
        var item = $("#grid").data("kendoGrid").dataItem(row);
        $.ajax(
            type: "POST",
            url: "<?php echo base_url().'index.php/user_management/manage_users/list_view/'?>"+JSON.parse(item.UserID),
            success: function(data)
                alert("done");
                //$('.second_column_content_container').html(output_string);
                //$('.second_column_content_container').innerHTML("hello");
                //alert(output_string);
            ,
            error: function(data)
                alert("error");
            
        );


        //var grid = $("#grid").data("kendoGrid");

        //alert(JSON.parse(item.UserID));
        //window.location.href="http://www.google.com/";



    
</script>
        <script type="text/x-kendo-template" id="template">
                <div id="details-container">
                    <h2>#= FirstName #</h2>
                    <h2>City: #= City # </h2>
                </div>
        </script>
<script type="text/x-kendo-template" id="toolbarTemplate">
    <div class="toolbar">
        <label class="category-label" for="users">Search Users: </label>
        <input type="text" id="users" style="width: 250px;" />
    </div>
</script>

<div class="data_column_a">
    <img src=""  id="pre_image" >
</div>

现在如何解决这个非常困难的问题O_o??


更新: 此用户名位于网格的第 2 页上,如屏幕截图所示。

但在搜索期间,当我搜索第 1 页以外的用户名时,它会发送第 1 页的标题。

把我的头撞到墙上,如何解决?

【问题讨论】:

【参考方案1】:

问题似乎与您的autocomplete 定义有关,该定义未在read 上发送任何Username 参数。尝试将transport.read 定义为:

transport     : 
    read    : 
        url : "search_user.php",
        data: function (arg) 
            return Username : autocompleteUsers.data("kendoAutoComplete").value();
        
    ,
    dataType: "json",
    type    : "POST"
,

EDIT:用于在autocomplete 上应用选定值作为网格的过滤条件。你应该这样做:

var autocompleteUsers = $("#users").kendoAutoComplete(
    dataTextField: "Username",
    dataSource   : 
        severFiltering: true,
        transport     : 
            read    : 
                url : "search_user.php",
                data: function (arg) 
                    return Username: autocompleteUsers.data("kendoAutoComplete").value();
                
            ,
            dataType: "json",
            type    : "POST"
        
    ,
    change       : function () 
        var username = autocompleteUsers.data("kendoAutoComplete").value();
        var filter = 
            logic  : "and",
            filters: [
                
                    ignoreCase: true,
                    field     : "Username",
                    value     : username,
                    operator  : "startswith"
                
            ]
        ;
        $("#grid").data("kendoGrid").dataSource.filter(filter);
    
);

【讨论】:

我已经修改了代码并且它可以工作,但现在的问题是当我在文本框中输入内容时,网格过滤器正确但是当项目在第 2 页或其他年龄(例如)时,在网格上过滤不起作用,我只看到一个空网格。 您介意向我解释一下您要达到的目标吗?是否通过username 过滤grid 内容,但使用autocomplete 而不是网格列标题? 是的,确切地说,我有一个文本框,其中会弹出一个自动完成功能并相应地过滤网格,但这仅适用于第一页,即网格中显示的第一个项目。如果我搜索项目,即网格的下一页(第 2 页),则网格过滤但网格中的数据为空 请看这张图片:i341.photobucket.com/albums/o377/pakistanihaider/… 数据来自数据库并显示在下拉列表中,但是当点击空网格时显示因为数据在其他页面上。 在这张图片中,当点击结果时,结果会显示在网格中,因为用户位于网格的第一页。 i341.photobucket.com/albums/o377/pakistanihaider/…

以上是关于工具栏上带有自动完成功能的 kendoui Grid?的主要内容,如果未能解决你的问题,请参考以下文章

kendoui + angularjs + 自动完成显示文本但将 id 设置为值

使用 Javascript/KendoUI 自动完成渲染数据时出错 - 对象 #<Object> 没有方法“切片” - 如何解决?

Kendo UI Angular JS 和带有服务的 AutoComplete

单击编辑按钮时,Kendoui Grid 获取选定的行 ID

jquerymobile自动完成列表未隐藏

带有 Asp.net MVC 的 Kendo UI 图表