2014-02-26 142 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 
}