RadGrid客户端绑定

时间:2012-03-15 23:18:53

标签: telerik telerik-grid

我有一个关于Telerik 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>

我感谢任何解决这个问题的帮助!

2 个答案:

答案 0 :(得分: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绑定到复杂的客户端” 附:覆盖你可以编写的功能

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 />
}

答案 1 :(得分:0)

我认为你不能像那样做复杂的数据绑定。相反,我会创建一个直接返回Country Code的新属性,然后绑定到该属性。例如:

[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>