将新行插入网格会导致重复行

时间:2019-05-11 23:11:35

标签: jquery kendo-ui kendo-grid

我有一个网格,其中第一行始终将是一个空行,您可以在该行中从多列组合框中选择一个姓氏,一旦选择了所找到的人,它就会将该记录插入网格中,然后再次-添加一个空行,您可以继续将记录添加到网格中。

我遇到的最大问题是,当我从组合框中选择一个姓氏时,它会添加该记录,但随后会添加一个新行(如预期的那样),但是该行在新的空行中具有新添加的记录姓氏...

以下是添加新记录之前的屏幕截图

Before

这是我添加新记录后的屏幕截图

After

有人知道如何解决此问题,其原因是什么?

function AddNewRow() {
  let grid = $("#GridList").data("kendoGrid");
  grid.dataSource.insert(0, {
    CustomerID: null,
    FirstName: "",
    LastName: "",
    Address: "",
    City: "",
    Zip: ""
  });
}

var junkData = [{
    "FirstName": "Ben",
    "LastName": "abc",
    ID: 1
  },
  {
    "FirstName": "Bob",
    "LastName": "def",
    ID: 2
  },
  {
    "FirstName": "Joe",
    "LastName": "ghi",
    ID: 3
  },
  {
    "FirstName": "Clarice",
    "LastName": "jkl",
    ID: 4
  },
];

function LNameEditor(container, options) {
  let combobox = $('<input data-text-field="LastName" data-value-field="LastName" data-bind="value:' + options.field + '" />')
    .appendTo(container)
    .kendoMultiColumnComboBox({
      dataTextField: "LastName",
      height: 300,
      columns: [{
        field: "LastName",
        title: "Last Name",
        width: 100
      }],
      filter: "startswith",
      filterFields: ["LastName"],
      dataSource: {
        data: junkData
      },
      change: function(e) {
        let items = e.sender._data()[0];

        let grid = $("#GridList").data("kendoGrid");
        grid.dataSource.insert(1, {
          CustomerID: items.ID,
          FirstName: items.FirstName,
          LastName: items.LastName,
          Address: items.Address,
          City: items.City,
          Zip: items.Zip,
        });

      },
      select: function(e) {}
    });
}


var readonlyEditor = function(container, options) {
  let gridWidget = $("#GridList").data("kendoGrid");
  gridWidget.closeCell();
};

var gridData = [{
    "CustomerID": 3,
    "FirstName": "The Skipper",
    "LastName": "Gilligan",
    "Address": "1 Main St.",
    "City": "Toledo",
    "Zip": "123456"
  },
  {
    "CustomerID": 4,
    "FirstName": "Archie Bunker",
    "LastName": "Edith Bunker",
    "Address": "2 South St.",
    "City": "Memphis",
  }
];

function LoadGrid() {
  $("#GridList").kendoGrid({
    dataSource: {
      data: gridData
    },
    schema: {
      model: {
        fields: {
          CustomerID: {
            type: "number",
            editable: false
          },
          CustomerFirstName: {
            type: "string"
          },
          CustomerLastName: {
            type: "string"
          },
          CustomerAddress1: {
            type: "string"
          },
          City: {
            type: "string"
          },
          Zip: {
            type: "string"
          }
        },
      }
    },
    filterable: {
      mode: "row"
    },
    columns: [{
        title: "<input id='checkAll', type='checkbox', class='check-box' />",
        template: "<input name='Selected' class='checkbox' type='checkbox'>",
        width: "30px"
      },
      {
        field: "CustomerID",
        title: "CustomerID",
        hidden: false,
        headerAttributes: {
          "class": "wrap-header"
        },
        editor: readonlyEditor
      },
      {
        field: "LastName",
        title: "Last Name",
        filterable: {
          cell: {
            showOperators: false,
            operator: "contains"
          }
        },
        editor: LNameEditor,
        template: "#=LastName #"
      },
      {
        field: "FirstName",
        title: "Name",
        filterable: {
          cell: {
            showOperators: false,
            operator: "contains"
          }
        },
        editor: readonlyEditor
      },
      {
        field: "Address",
        title: "Address",
        filterable: {
          cell: {
            showOperators: false,
            operator: "contains"
          }
        },
        editor: readonlyEditor
      },
      {
        field: "City",
        title: "City",
        filterable: {
          cell: {
            showOperators: false,
            operator: "contains"
          }
        },
        editor: readonlyEditor
      },
      {
        field: "Zip",
        title: "Zip",
        filterable: {
          cell: {
            showOperators: false,
            operator: "contains"
          }
        },
        editor: readonlyEditor
      }
    ],
    editable: true,
    scrollable: true,
    sortable: true,
    pageable: false,
    selectable: "row",
    change: function(e) {
      // Function call goes here
      var detailRow = this.dataItem(this.select());
      var optionID = detailRow.get("CustomerID")
    },
    height: 400
  });

  AddNewRow();
}

$(document).ready(function() {

  LoadGrid();

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://kendo.cdn.telerik.com/2019.1.220/js/kendo.all.min.js"></script>
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.220/styles/kendo.common.min.css" />
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.220/styles/kendo.rtl.min.css" />
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.220/styles/kendo.silver.min.css" />
<link rel="stylesheet" href="https://kendo.cdn.telerik.com/2019.1.220/styles/kendo.mobile.all.min.css" />

<div id="MyDiv">
  <div id="GridList" tabindex="-1"></div>
</div>

1 个答案:

答案 0 :(得分:1)

这里有2个问题:

  1. 您不是要清除/重置“空”行,但我认为您认为自己是。 在ComboBox的change事件中,您所要做的就是在索引1处添加新行,仅此而已……您将单独保留行0,这包括将LastName设置为选定的任何内容。 您实际上需要重置第0行。 这可以通过删除当前行0并将其替换为“干净的”行0来实现。您可以使用AddNewRow()帮助器来做到这一点。
  2. 您实际上不是从ComboBox中选择的项目中选择数据。 在ComboBox更改事件中,您只是从ComboBox的数据源中获取第一项,而不是所选项。 您确实要选择的项目而不是项目0。

如果将change事件更新为类似的内容,它应该会更好地工作:

change: function(e) {
    // THIS IS NOT THE DATA YOU WANT.
    // e.sender is the ComboBox so this will always be "abc"(index 0 of the ComboBox dataSource) rather than the selected item.
    // let items = e.sender._data()[0];
    let items = e.sender._data()[e.sender.selectedIndex];

    let grid = $("#GridList").data("kendoGrid");
    grid.dataSource.insert(1, {
      CustomerID: items.ID,
      FirstName: items.FirstName,
      LastName: items.LastName,
      Address: items.Address,
      City: items.City,
      Zip: items.Zip,
    });

    // Need to "clear" the "empty" row, which is always row 0.
    // We can do this by removing and re-adding the row(among other ways).
    let dataItem = grid.dataSource.at(0);
    grid.dataSource.remove(dataItem);
    AddNewRow();
  }

工作示例:https://dojo.telerik.com/@Stephen/EnIruLOm