RadGrid на стороне клиента - PullRequest
0 голосов
/ 16 марта 2012

У меня есть вопрос относительно привязки клиентской стороны Telerik RadGrid control. Я хочу, чтобы заполнить сетку с городами на стороне клиента. У меня есть объект Город, который имеет свойство Страна:

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

}

Я получаю эти данные как объект JSON на стороне клиента, используя JQuery Ajax и WCF. и затем я привязываю его к сетке:

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 голос
/ 25 июня 2012

Вы можете просто перезаписать 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 />
}
0 голосов
/ 18 марта 2012

Я не думаю, что вы можете сделать сложную привязку данных таким образом. Вместо этого я создаю новое свойство, которое возвращает код страны напрямую, а затем привязывается к нему. Пример:

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

...