【问题标题】:Error when edit non string property when Objects Binded To TcxGridTableView using DSharp使用 DSharp 将对象绑定到 TcxGridTableView 时编辑非字符串属性时出错
【发布时间】:2015-12-04 02:26:11
【问题描述】:

我有一个类对象

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 属性绑定到 Tedit 时,我可以修改它的值。有谁知道这是怎么回事?

【问题讨论】:

    标签: delphi delphi-xe


    【解决方案1】:

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

    另一种方法是关闭presenter中的UseColumnDefinitions属性,自己创建所有列。

    【讨论】:

    • 我尝试了您的建议,但它仍然会生成 Invalid Typecast AV。这是我的代码: prescontactpresenter.View.ItemsSource := list.AsList; cxGridTableGrid1TableView1.Columns[3].PropertiesClass := TcxSpinEditProperties;
    【解决方案2】:

    我找到了解决方法。我修改了单元 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 数据类型,结果正常

    【讨论】:

    • @Stefan:你觉得我的回答怎么样? tq
    • 如果那是您的源代码,那么您使用的是 master 而不是 spring4d-compatibility 分支中的最新版本。
    • @Stefan,我从 spring4d-compatibility 下载,结果是一样的。它还生成 AV
    猜你喜欢
    • 2012-01-29
    • 2020-06-08
    • 2011-07-27
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多