2014-02-26 106 views
1

所以我使用Kendo Ui创建了网格,并且在这个网格中我有一个详细的行模板。我创建这样这是一个Kendo Ui Grid的bug吗?

$(document).ready(function() { 
    var theModel = @(Html.Raw(Json.Encode(Model.Datas))); 
    //If the model is empty then create the No data Grid 
    if (theModel.length < 1) { 
     $("#AccessGrid").kendoGrid({ 
      columns:[ 
       { 
        field: "Message", 
        title: " " 
       } 
       ],    
      dataSource: [{Message:"No data"}] 
     }); 
    } else {//create the normal grid 
     $("#AccessGrid").kendoGrid({ 
     columns:[ 
      { 
       field: "ProjNo", 
       title: "Project #" 
      }, 
      { 
       field: "ProjType", 
       title: "Job Type" 
      }, 
      { 
       field: "ProjAddress", 
       title: "Address" 
      }], 
     selectable:true, 
     scrollable:false, 
     dataSource:theModel, 
     detailTemplate: kendo.template($("#AcccessDetailTemplate").html()), 
     detailInit:initDetailGrid 
    }); 
    } 

}); 

initDetailGrid(e)主电网被用来创建细节电网

function initDetailGrid(e) { 

    var grid = e.sender; 

    var currentDataItem = grid.dataItem(grid.select()); //Get the data for the selected row 
    //if there are no data in intExtData then create a default obj 

    if (currentDataItem.InternalData == null||currentDataItem.InternalData == undefined||currentDataItem.InternalData.length < 1) {   
      currentDataItem.InternalData = [{   
       TaskId:-1, 
       Internal: -1, 
       Sequence: -1 
     }]; 
    } 

    e.detailRow.find("[name='AcccessDetail']").kendoGrid({ 
     columns:[ 
      { 
      field:"TaskId", 
      title: "<input type='checkbox' onclick='AccessModal.checkAll(event)'/>", 
      template:$("#detailInputColumnTemplate").html(), 
      width: "35px" 
     }, 
     { 
      field: "Internal", 
      title: " ", 
      template:$("#detailColumnTemplate").html()    
     } 
     ], 
     scrollable:false, 
     dataSource:currentDataItem.InternalData 
    });  
} 

的问题是,有时不显示的一行或多行我的详细信息模板和误差抛出说Uncaught TypeError: Cannot read property 'InternalData' of null,但怎么可能呢?我知道那里有数据,因为如果我刷新并单击行细节,数据就会显示出来。这并非一直发生,但它足以让我注意到。有没有人遇到过这样的事情

+1

当你点击一个按钮的细节,电网必须选择行,其中包括该按钮,但如果您移动鼠标的时候还是点击,电网不选择任何行。所以'var currentDataItem = grid.dataItem(grid.select()); '由于'grid.select()'而出错。在我看来,是的,这是一个错误。 – MustafaP

+0

特别尝试使用chrome.hold单击详细按钮,向左或向右移动鼠标3或4 px,然后抬起鼠标。 – MustafaP

+0

谢谢你帮助我学习如何重新创建这个。也许你可以把它作为答案,我会接受。 –

回答

2

这不是一个错误。您不应该依靠选定的行来获取详细信息行的数据。 detailInit事件提供对传递给处理程序的事件对象的data字段中的行数据的直接访问。

试试这个:

function initDetailGrid(e) { 
    var grid = e.sender, 
     dataItem = e.data; 

    if (!dataItem.InternalData || dataItem.InternalData.length === 0) { 
     // ... 
    } 

    // ... 
} 

我希望帮助!

+0

在我的网格中的某些行上,打开detailInit(e)e是未定义的...您有任何想法如何解决这个问题吗? –

0

当您单击详细按钮时,网格必须选择包含该按钮的行,但如果您移动鼠标,但仍然单击时,网格不会选择任何行。所以var currentDataItem = grid.dataItem(grid.select());给出了错误,因为grid.select()。在我看来,是的,它是一个bug。尤其是尝试chrome.hold点击细节按钮,左右移动鼠标3或4 px,然后提起鼠标。

通过,如果你只有一个网格,您可以更改可选属性为假,并获得点击的DataItem通过var dataItem = this.dataItem($(e.currentTarget).closest("tr"));

但是,如果你有两个网格,第二个结合或根据第一格栅的选择行筛选的方式,你必须在JavaScript中使用try catch并回滚所有内容。

对于EXP:

try 
{ 
    var grid = $("#donemGrid").data("kendoGrid"); 
    var rows = grid.select();  
    var DonemId= grid.dataItem(rows).DonemId; 
    var data = grid.data("kendoGrid"); 
    data.dataSource.filter({ field: "DonemId", operator: "eq", value: parseInt(DonemId) 
} 
catch{ 
    //set every thing like in time before clicked 
}