2012-03-15 126 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 /> 
}