Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kendo Grid Navigate Row From Button (First, Back, Next, Last)

I'd like to navigate the row on Kendo-Grid. I have 4 Buttons, First, Previous, Next and Last. When the button is clicked it will highlight the record from the Kendo-Grid. I'm not sure how to achieve this. I can get the row index on click button but I cannot make the Kendo-Grid hight light the row and extract the record to be displayed in text box. here are some piece of my code:

On View

<div>
            <button id="reg-view-first" title="First" class="menu-item supplementary-table-menu k-grid-add" onclick="javascript:first();">
                <img src="@Url.Content("~/Images/first_16.png")" /></button>
            <button id="reg-view-back" title="Back" class="menu-item supplementary-table-menu k-grid-add" onclick="javascript:back();">
                <img src="@Url.Content("~/Images/back_16.png")" /></button>
            <button id="reg-view-next" title="Next" class="menu-item supplementary-table-menu" onclick="javascript:next();">
                <img src="@Url.Content("~/Images/forward_16.png")" /></button>
            <button id="reg-view-prev" title="Last" class="menu-item supplementary-table-menu" onclick="javascript:last();">
                <img src="@Url.Content("~/Images/last_16.png")" /></button>
        </div>

function last() {
                var grid = $("#queue-table").data("kendoGrid");
                //var rowCount = grid.dataSource.view().length; //on current display.

                var rowCount = grid.dataSource.data().length;   //Actual record count.
                var itemID = grid.dataSource.at(rowCount - 1).ItemID

                grid.clearSelection();
                var row = $(this).closest("tr");
                var dataItem = grid.dataItem(row);

                row.addClass("k-state-selected");

                //grid.select(itemID);
                //alert(itemID);
            }

function back() {
                var grid = $("#queue-table").data("kendoGrid"); //document.getElementsByName("queue-table");
                if (grid != null || grid != "undefined")
                {
                    //get the selected index.
                    var dataRows = grid.items();
                    var rowIndex = dataRows.index(grid.select());
                    //alert(rowIndex);

                    var dataItem = grid.dataItem(grid.select());
                    //var itemID = grid.columns[0].field;

                    var itemID = grid.dataSource.at(1).ItemID;
                    grid.select("tr[data-uid='" + itemID + "']");

                    var newRow = dataRows.index(grid.select());
                    newRow.addClass("k-state-selected");

                    //assign the new selected index
                    //var newIndex = 0;
                    //if (rowIndex > 0)
                    //{
                    //    newIndex = rowIndex - 1
                    //}

                    //alert(newIndex);
                }

Im a newbie in Kendo and already spent couple of hours figuring out what to do.

like image 784
al123 Avatar asked Dec 31 '25 15:12

al123


2 Answers

After so many trial and error and searching over the web I came up with this solution:

function first() {
            var grid = $("#queue-table").data("kendoGrid");
            if (grid) {
                var rowCount = grid.dataSource.data().length;                           //Actual record count on the grid.
                if (rowCount) {
                    var itemID = grid.dataSource.at(0).ItemID;                          //Get the ItemID (model id) from the first row of the grid.
                    var dataItem = grid.dataSource.get(itemID);                         //get the data-uid of the itemID which is generated by kendo.
                    var row = grid.tbody.find("tr[data-uid='" + dataItem.uid + "']");   //Find the data-uid on the grid.
                    grid.clearSelection();                                              //Clear the current selection on the grid.
                    row.addClass("k-state-selected");                                   //add highlight on the row
                    grid.trigger("change");                                             //execute the onChange event of the grid.
                }
            }
        }

        function back() {
            var grid = $("#queue-table").data("kendoGrid");
            if (grid) {
                var rowCount = grid.dataSource.data().length;                           //Actual record count on the grid.
                if (rowCount) {
                    var rows = grid.items();
                    var currSelRowIndex = rows.index(grid.select());
                    var prevRowIndex = 0;                                               //initialize the previous row index.

                    if (currSelRowIndex > 0) {
                        prevRowIndex = currSelRowIndex - 1;                             //decrease index by 1.
                    }
                    var itemID = grid.dataSource.at(prevRowIndex).ItemID;               //Get the ItemID (model id) from the first row of the grid.
                    var dataItem = grid.dataSource.get(itemID);                         //get the data-uid of the itemID which is generated by kendo.
                    var row = grid.tbody.find("tr[data-uid='" + dataItem.uid + "']");   //Find the data-uid on the grid.
                    grid.clearSelection();                                              //Clear the current selection on the grid.
                    row.addClass("k-state-selected");                                   //add highlight on the row
                    grid.trigger("change");                                             //execute the onChange eve
                }
            }
        }

        function next() {
            var grid = $("#queue-table").data("kendoGrid");
            if (grid) {
                var rowCount = grid.dataSource.data().length;                       //Actual record count on the grid.
                if (rowCount) {
                    var rows = grid.items();                                            //get all rows
                    var currSelRowIndex = rows.index(grid.select());                    //get the current selected index from grid
                    var nextRowIndex = rowCount - 1;                                   //initialize the previous row index.

                    if (currSelRowIndex < rowCount - 1) {
                        nextRowIndex = currSelRowIndex + 1;                             //increase index by 1.
                    }

                    var itemID = grid.dataSource.at(nextRowIndex).ItemID;               //Get the ItemID (model id) from the first row of the grid.
                    var dataItem = grid.dataSource.get(itemID);                         //get the data-uid of the itemID which is generated by kendo.
                    var row = grid.tbody.find("tr[data-uid='" + dataItem.uid + "']");   //Find the data-uid on the grid.
                    grid.clearSelection();                                              //Clear the current selection on the grid.
                    row.addClass("k-state-selected");                                   //add highlight on the row
                    grid.trigger("change");                                             //execute the onChange eve
                }
            }
        }

        function last() {
            var grid = $("#queue-table").data("kendoGrid");
            if (grid) {
                var rowCount = grid.dataSource.data().length;                       //Actual record count on the grid.
                if (rowCount) {
                    var itemID = grid.dataSource.at(rowCount - 1).ItemID                //Get the ItemID (model id) at the last row of the grid.
                    var dataItem = grid.dataSource.get(itemID);                         //get the data-uid of the itemID which is generated by kendo.
                    var row = grid.tbody.find("tr[data-uid='" + dataItem.uid + "']");   //Find the data-uid on the grid.
                    grid.clearSelection();                                              //Clear the current selection on the grid.
                    row.addClass("k-state-selected");                                   //add highlight on the row
                    grid.trigger("change");                                             //execute the onChange event of the grid.
                }
            }
        }
<div>
        <button id="reg-view-first" title="First" class="menu-item supplementary-table-menu k-grid-add" onclick="first()">
            <img src="@Url.Content("~/Images/first_16.png")" /></button>
        <button id="reg-view-back" title="Back" class="menu-item supplementary-table-menu k-grid-add" onclick="back()">
            <img src="@Url.Content("~/Images/back_16.png")" /></button>
        <button id="reg-view-next" title="Next" class="menu-item supplementary-table-menu" onclick="next()">
            <img src="@Url.Content("~/Images/forward_16.png")" /></button>
        <button id="reg-view-prev" title="Last" class="menu-item supplementary-table-menu" onclick="last()">
            <img src="@Url.Content("~/Images/last_16.png")" /></button>
    </div>

It was the data-uid that will make the grid row selection active. I've found this forum

So far this works for me. If there are any better answer, sharing is caring. :)

like image 169
al123 Avatar answered Jan 03 '26 03:01

al123


How about this:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Kendo UI Snippet</title>

    <link rel="stylesheet" href="http://kendo.cdn.telerik.com/2016.3.1028/styles/kendo.common.min.css"/>
    <link rel="stylesheet" href="http://kendo.cdn.telerik.com/2016.3.1028/styles/kendo.rtl.min.css"/>
    <link rel="stylesheet" href="http://kendo.cdn.telerik.com/2016.3.1028/styles/kendo.silver.min.css"/>
    <link rel="stylesheet" href="http://kendo.cdn.telerik.com/2016.3.1028/styles/kendo.mobile.all.min.css"/>

    <script src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
    <script src="http://kendo.cdn.telerik.com/2016.3.1028/js/kendo.all.min.js"></script>
</head>
<body>

<div id="grid"></div>
<script>
$("#grid").kendoGrid({
  columns: [
    { field: "name" },
    { field: "age" }
  ],
  dataSource: [
    { name: "a1", age: 30 },
    { name: "a2", age: 33 },
    { name: "a3", age: 30 },
    { name: "a4", age: 33 },
    { name: "a5", age: 30 },
    { name: "a6", age: 33 },
    { name: "a7", age: 30 },
    { name: "a8", age: 33 }
  ],
  selectable: "single, row"
});

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

  function selectionChanged() {
    let selected = grid.select();
    if (selected[0]) {
      console.log(document.getElementById("label"));
      document.getElementById("label").value = grid.dataItem(selected).name;
    }
  }

  function selectFirst() {
    grid.select("tr:first");

    selectionChanged();
  }

  function selectLast() {
    grid.select("tr:last");

    selectionChanged();
  }

  function selectNext() {
    let selected = grid.select();
    if (selected[0]) {
      let index = (selected[0].rowIndex + 1) % grid.items().length;
      grid.select("tr:eq(" + index + ")");
    }

    selectionChanged();
  }

  function selectPrev() {
    let selected = grid.select();
    if (selected[0]) {
      let index = selected[0].rowIndex - 1;
      grid.select("tr:eq(" + index + ")");
    }

    selectionChanged();
  }

</script>
  <button onclick="selectFirst()">First</button>
  <button onclick="selectLast()">Last</button>
  <button onclick="selectPrev()">Previous</button>
  <button onclick="selectNext()">Next</button>
  <br>
  Selected: <input type="text" id="label" readonly></input>
</body>
</html>
like image 23
Shai Avatar answered Jan 03 '26 04:01

Shai



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!