首页 文章

RadGrid客户端绑定

提问于
浏览
0

我有一个关于Telerik RadGrid控件客户端绑定的问题 . 我想在客户端的城市中填充网格 . 我有一个对象City,它有一个属性Country:

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

  • 1

    我不认为你可以像这样做复杂的数据绑定 . 相反,我会创建一个直接返回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>
    
  • 0

    您可以通过从原始缩小的telerik脚本替换此片段来覆盖Telerik.Web.UI.GridTableView.dataBind函数:

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

    希望这有助于某人,因为这是我偶然发现问题的答案的第一个结果"How to bind RadGrid to complex object clientside"
    附:覆盖你可以写的功能

    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 :)
    }

相关问题