按Enter键

时间:2017-06-27 16:02:03

标签: javascript kendo-ui kendo-grid

我目前有一个分级的Kendo Grid,我可以批量编辑一些细节列。我已经激活了自动同步,因此我只需要丢失我编辑的单元格的焦点或按Enter键,它会自动保存。

到目前为止,这是有效的,但我现在需要的是当用户按下单元格中的输入时,焦点会更改为下一行,同一列。

我会用言语表达我的语境。我有一份车辆清单。我可以扩展这些行,以便查看所选汽车的预订列表。在给定时间之后,用户将在每次预订后输入车辆的里程数。让我们说车辆有10个预订。当用户输入第一里程数据然后按回车键时,焦点改变到下一行并且他可以输入下一个里程。等等10个预订。我真的不知道如何实现这一点,我想我应该寻求帮助。

这是我的相关代码。

Master Grid:

<div class="col-md-12">
        @(Html.Kendo().Grid<ParcAutoMvc.ViewModels.VehiculeViewModel>()
                .Name("gridListeVehicule")
                .Events(e => e.DataBound("onDataBoundVehiculeReservation"))
                .Columns(columns =>
                {
                    columns.Bound(c => c.VehiculeID);
                    columns.Bound(c => c.Description);
                    columns.Bound(c => c.Marque.Description);
                    columns.Bound(c => c.Modele.Description);
                    columns.Bound(c => c.Annee);
                })
                .Groupable()
                .NoRecords(e => e.Template("<div style='padding:30px 0;'><i>Aucun enregistrement à afficher</i></div>"))
                .Pageable(e => e.Messages(mes => mes.Empty("Aucun enregistrement à afficher")))
                .Sortable()
                .ClientDetailTemplateId("client-template")
                .AutoBind(false)
                .Scrollable(s => s.Enabled(false))
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .PageSize(25)
                    .Read(read => read.Action("ListeVehiculeReservation", "Operation").Data("FiltreVehiculeReservation"))
                    )
                .HtmlAttributes(new { @class = "small" })
        )
    </div>

详情网格:

<script id="client-template" type="text/x-kendo-template">
        @(Html.Kendo().Grid<ParcAutoMvc.ViewModels.ReservationViewModel>()
  .Name("grid_#=VehiculeID#") // make sure the Name is unique
  .Events(e => e.DataBound("onDataBoundReservation").Edit("onEditReservation").Save("onSaveReservation"))
  .Columns(columns =>
  {
      columns.Bound(c => c.Depart);
      columns.Bound(c => c.Arrivee);
      columns.Bound(c => c.Ville);
      columns.Bound(c => c.Endroit);
      columns.Bound(c => c.ReservePour);
      columns.Bound(c => c.KMDepart).ClientTemplate("\\#=Statut == 0 ? 'Annulée' : KMDepart == -1 ? '' : KMDepart\\#");
      columns.Bound(c => c.KMArrivee).ClientTemplate("\\#=Statut == 0 ? 'Annulée' : KMArrivee == -1 ? '' : KMArrivee\\#");
  })
  .Editable(editable => editable.Mode(GridEditMode.InCell)) // Use in-cell editing mode
  .DataSource(dataSource =>
      // Load reservations
      dataSource.Ajax()
      .Model(model =>
      {
          model.Id(r => r.Id);
          model.Field(r => r.KMArrivee);
          model.Field(r => r.KMDepart);
          model.Field(r => r.Endroit).Editable(false);
          model.Field(r => r.Depart).Editable(false);
          model.Field(r => r.Arrivee).Editable(false);
          model.Field(r => r.Ville).Editable(false);
          model.Field(r => r.ReservePour).Editable(false);
          model.Field(r => r.Id).Editable(false);
      })
      .Batch(true)
      .AutoSync(true)
      .Update(update => update.Action(actionName: "Grille_Modifier", controllerName: "Operation"))
      .Read(read => read.Action("ListeReservation", "Operation").Data("FiltreReservation(#=VehiculeID#)"))
  )
  .Pageable(e => e.Messages(mes => mes.Empty("Aucun enregistrement à afficher")))
  .ToClientTemplate()
        )
    </script>

最重要的是,这是我的问题的相关代码。我知道我可能需要使用javascript设置焦点,但我无法弄清楚如何。我设法获得了下一行的UID,但我不知道如何处理它,或者即使它对我想要做的事情有用。

function onSaveReservation(e) {
            var uid = e.model.uid;
            var idx = $(e.container).index();
            var sender = e.sender;

            dataView = this.dataSource.view();

            for (var i = 0; i < dataView.length; i++) {
                if (dataView[i].uid == uid) {
                    var vehiculeID = dataView[i].VehiculeID
                    if (dataView[i + 1] != null)
                    {
                        var nextUid = dataView[i + 1].uid;
                    }

                }

            }
        }

我非常感谢能够帮助我解决问题的每个人。请告诉我,如果我不清楚我想做什么,英语不是我的第一语言。如果您有任何需要,请不要犹豫,要求我提供更多代码示例。

1 个答案:

答案 0 :(得分:0)

已经有一段时间了,但是我发现了如何做自己想做的事,我想我会告诉人们,以防将来对任何人有帮助。

我放出了很多代码,只保留了相关的内容,以使焦点集中在下一行的同一列的下一个单元格上。如果有人需要更多,请随时问。

//In my onSave Event I assign the next cell based on the selected car and row
gridReservation = $("#grid_" + vehiculeID); 
rowEdited = gridReservation.data("kendoGrid").tbody.find("tr[data-uid='" + e.model.uid + "']").index();
nextRow = rowEdited + 1;
nextCell = '#grid_' + vehiculeID + ' tbody tr:eq(' + nextRow + ') td:eq(6)' //In my case I needed the 6th column;

//Then on my onDataBound event of my detail grid I set which cell I need to be editing
var theCell = $(nextCell);
gridReservation.data('kendoGrid').editCell(theCell);

希望它对任何人都有帮助