使用DSharp将对象绑定到TcxGridTableView时编辑非字符串属性时出错

时间:2015-12-04 02:26:11

标签: delphi delphi-xe

我有一个类对象

TContact = class(TObject)
  private
    FChild: TContact;
    FLastname: string;
    FFirstname: string;
    FAge: Integer;
    procedure SetFirstname(const Value: string);
    procedure SetLastname(const Value: string);
  public
    constructor Create(AFirstname: string = ''; ALastname: string = ''; AChild :
        TContact = nil; AAge : Integer = 10);
    property Child: TContact read FChild write FChild;
    property Firstname: string read FFirstname write SetFirstname;
    property Lastname: string read FLastname write SetLastname;
    property Age: Integer read FAge write FAge;
end;

我想在TcxGridTableView中显示一些对象。这是我在TcxGridTableView上显示一些对象的代码

var
  lFather: TContact;
  list: IList<TObject>;
  lJon: TContact;
  lMother: TContact;
begin
  list := TObservableCollection<TObject>.Create();

  lJon    := TContact.Create('Jericho', 'Doe', TContact.Create('No Child'),8);
  lFather := TContact.Create('John', 'Doe', lJon, 48);
  lMother :=  TContact.Create('Nancy', 'More', lJon, 45 );

  list.Add(lJon);
  list.Add(lFather);
  list.Add(lMother);

  prescontactpresenter.View.ItemsSource := list.AsList;
end;

一切都运转良好。我可以修改FirstName和Lastname的值。但是当我直接在age列上修改Age属性值时,我收到以下错误:

Image

但是当我将Age属性绑定到Tedit时,我可以修改它的值。有谁知道它是怎么回事?

2 个答案:

答案 0 :(得分:0)

您需要设置该列的PropertiesClass(比如说TcxSpinEditProperties)。这可以在设置ItemsSource之后完成。否则,默认列属性是TextEdit,它将以字符串形式发送值,不会在绑定中自动转换为Integer。

另一种方法是关闭演示者中的UseColumnDefinitions属性并自行创建所有列。

答案 1 :(得分:0)

我找到了解决方法。我修改了单位DSharp.DevExpress.PresenterDataSource

procedure TGridViewPresenterDataSource.SetValue(
  ARecordHandle: TcxDataRecordHandle; AItemHandle: TcxDataItemHandle;
  const AValue: Variant);
var
  LItemTemplate: IDataTemplate;
begin
  LItemTemplate := FPresenter.GetItemTemplate(ARecordHandle);
  // remarked bagus BP
  //LItemTemplate.SetText(ARecordHandle, Integer(AItemHandle), VarToStrDef(AValue, ''));
  LItemTemplate.SetValue(ARecordHandle, Integer(AItemHandle), TValue.FromVariant(AValue));
end;

我尝试使用String,Integer,Float和DateType数据类型,结果没问题