2012-03-15 123 views
0

我有一個關於Telerik RadGrid控件客戶端綁定的問題。我想在客戶端的城市填充網格。我有一個目標城市,它有一個屬性國家:RadGrid客戶端綁定

[DataContract] 
[KnownType(typeof(Country))] 
public class City 
{ 
    [DataMember] 
    public virtual string CityCode { get; set; } 

    [DataMember] 
    public virtual string CityName { get; set; } 

    [DataMember]} 
    public virtual Country Country  { get; set;    
    } 
} 

[DataContract] 
public class Country 
{ 
    [DataMember] 
    public virtual string CountryCode { get; set; } 
    [DataMember] 
    public virtual string Iso2Code { get; set; } 
    [DataMember] 
    public virtual string CountryName { get; set; } 
    [DataMember] 
    public virtual char RDC { get; set; } 

} 

我檢索該數據爲使用jQuery Ajax和WCF JSON對象到客戶端。 ,然後我把它綁定到網格:

rgCity.set_dataSource(dataItem); 
rgCity.dataBind(); 

下面是網格列定義:

<Columns> 
    <telerik:GridBoundColumn HeaderText="City Code" DataField="CityCode" MaxLength="3">  </telerik:GridBoundColumn> 
    <telerik:GridBoundColumn HeaderText="City Name" DataField="CityName"></telerik:GridBoundColumn> 
    <telerik:GridBoundColumn HeaderText="Country Code" DataField="CountryCode" MaxLength="2"></telerik:GridBoundColumn> 
</Columns> 

的問題是我沒有得到填充數據的國家代碼列。我認爲問題出在數據綁定上,但我不確定是否可以綁定複雜的對象。 我想應該是這樣的:

<telerik:GridBoundColumn HeaderText="Country Code" DataField="**City.CountryCode**" MaxLength="2"></telerik:GridBoundColumn> 

我明白任何解決該問題的幫助!

回答

0

我不認爲你可以做這樣複雜的數據綁定。相反,我會創建一個直接返回國家代碼的新屬性,然後綁定到該屬性。例如:

[DataContract] 
[KnownType(typeof(Country))] 
public class City 
{ 
    ... 

    [DataMember]} 
    public virtual CountryCode{ get Country.CountryCode; } 
} 

網格則聲明綁定是你有什麼:

<Columns> 
... 
<telerik:GridBoundColumn HeaderText="Country Code" DataField="CountryCode" MaxLength="2"></telerik:GridBoundColumn> 

+0

謝謝,那種解決方案:-) – 2012-03-22 12:13:22

+0

沒問題。它是如何工作的?如果您發現它有幫助,請將其標記爲已接受的答案。如果沒有幫助,讓我知道我還能做些什麼。 – msigman 2012-03-22 15:49:09

+0

@EvgeniyO我還能做些什麼來幫助您解決問題? :) – msigman 2012-03-24 16:16:30

1

您可以通過替換 只是覆蓋 Telerik.Web.UI.GridTableView.dataBind功能這個片段來自原始縮小的telerik腳本:

var J = r[v].get_uniqueName(); 
      var n = this.getCellByColumnUniqueName(H, J); 
      if (!n) { 
       continue; 
      }var D = r[v]._data.DataField; 
      if (typeof (D) == "undefined") { 
       D = J; 
      } var h = this._dataSource[u][D]; 
      if (h == null) { 
       h = ""; 

的東西,例如,像這樣:

var J = r[v].get_uniqueName(); 
      var n = this.getCellByColumnUniqueName(H, J); 
      if (!n) { 
       continue; 
      }var D = r[v]._data.DataField; 
      if (typeof (D) == "undefined") { 
       D = J; 
      } 
      //change here to eval the dataField 
      var h = AvoidEvalDueToPerformance(this._dataSource[u], D); 
      if (h == null) { 
       h = ""; 

AvoidEvalDueToPerformance函數的定義如下:

function AvoidEvalDueToPerformance(object, propertyString) { 
    var k = propertyString.split("."); 
     for (var i = 0; i < k.length; i++) 
      if (object[k[i]]) object = object[k[i]]; 
      else return object; 
    return object; 
} 

希望這可以幫助別人,因爲這是第一個結果,我偶然發現了尋找的答案問題「如何將RadGrid綁定到複雜客體端」
PS覆蓋你可以寫的功能

Telerik.Web.UI.GridTableView.dataBind.prototype = function(){ 
    //copy-paste the Telerik.Web.UI.GridTableView.dataBind.prototype contents 
    //from your favorite javascript debugger output 
    //(or grep output or w/e you prefer) here :)<br /> 
}