Delphi Livebinding列表框保持为空,网格已填充

Delphi Livebinding列表框保持为空,网格已填充,delphi,livebindings,Delphi,Livebindings,使用Delphi Seattle,我试图了解当前项目中livebinding的诀窍,并使用外部填充的TFDMemTable创建了一个表单。memTable连接到TGrid和TListbox。网格显示所有信息,但列表框保持为空 我做错了什么 代码(根据实际情况简化,但仍显示空列表框): Livebinding定义: object BindingsList1: TBindingsList Methods = <> OutputConverters = <> Lef

使用Delphi Seattle,我试图了解当前项目中livebinding的诀窍,并使用外部填充的TFDMemTable创建了一个表单。memTable连接到TGrid和TListbox。网格显示所有信息,但列表框保持为空

我做错了什么

代码(根据实际情况简化,但仍显示空列表框):

Livebinding定义:

object BindingsList1: TBindingsList
  Methods = <>
  OutputConverters = <>
  Left = 164
  Top = 237
object LinkGridToDataSourcebsAccounts: TLinkGridToDataSource
  Category = 'Quick Bindings'
  DataSource = bsAccounts
  GridControl = Grid1
  Columns = <>
end
object LinkFillControlToField1: TLinkFillControlToField
  Category = 'Quick Bindings'
  Control = ListBox1
  Track = True
  FillDataSource = bsAccounts
  FillDisplayFieldName = 'desc'
  AutoFill = True
  FillExpressions = <>
  FillHeaderExpressions = <>
  FillBreakGroups = <>
end
对象绑定列表1:TBindingsList
方法=
输出转换器=
左=164
Top=237
对象LinkGridToDataSourcebsAccounts:TLinkGridToDataSource
类别='快速绑定'
数据源=bsAccounts
GridControl=Grid1
列=
结束
对象链接FillControlToField1:TLinkFillControlToField
类别='快速绑定'
控件=ListBox1
轨迹=真
FillDataSource=bsAccounts
FillDisplayFieldName='desc'
自动填充=真
填充表达式=
FillHeaderExpressions=
FillBreakGroup=
结束
结束

我还尝试将LinkFillControlToField1的FillExpression设置为:

  FillExpressions = <
    item
      SourceMemberName = 'desc'
      ControlMemberName = 'Text'
    end>
FillExpressions=<
项目
SourceMemberName='desc'
ControlMemberName='Text'
结束>

但结果是一样的。。空列表框更新:

希望,如果您遵循这个示例,这是我第二次尝试使用 LiveBindings要填充TClientDataSet的列表框,您应该能够 它也在工作。您可能需要注意我在下面这个答案的原始版本中提到的填充TStringGrid的问题

DFM提取

  object ListBox1: TListBox
    Left = 8
    Top = 320
    Width = 121
    Height = 97
    ItemHeight = 13
    TabOrder = 6
  end
  object DataSource1: TDataSource
    DataSet = CDS1
    Left = 128
    Top = 24
  end
  object CDS1: TClientDataSet
    Aggregates = <>
    Params = <>
    OnNewRecord = CDS1NewRecord
    Left = 72
    Top = 24
    object CDS1ID: TIntegerField
      FieldName = 'ID'
    end
    object CDS1Name: TStringField
      FieldName = 'Name'
      Size = 40
    end
    object CDS1Value: TStringField
      FieldName = 'Value'
      Size = 80
    end
  end
  object BindSourceDB1: TBindSourceDB
    DataSource = DataSource1
    ScopeMappings = <>
    Left = 216
    Top = 32
  end
  object BindingsList1: TBindingsList
    Methods = <>
    OutputConverters = <>
    Left = 72
    Top = 96
    object LinkListControlToField1: TLinkListControlToField
      Category = 'Quick Bindings'
      DataSource = BindSourceDB1
      FieldName = 'Name'
      Control = ListBox1
      FillExpressions = <>
      FillHeaderExpressions = <>
      FillBreakGroups = <>
    end
  end
这次amd和我之前尝试的唯一不同之处是

LinkListControlToField1: TLinkListControlToField
我认为(事实证明是错误的)TLinkListControlToField是为 TlistView,但它显然也适用于TlistView

最初发布的答案

我不确定你是否做错了什么,LiveBindings对我来说似乎是一个简单的问题——请看我对这个问题的回答:。stringrid显示ID=6的行是重复的,但ID=5的行不是重复的,这一事实让我觉得不是特别有希望,因为这是一个非常明显的问题

我也无法让LiveBindings与ListBox一起工作,在一个新的西雅图VCL项目中自己从头开始做,或者跟随本文。这篇文章的几个问题之一是它引用了一个“TBindScopeDB”组件,据我所知,这个组件是不存在的。即使考虑到它可能是“TBindSourceDB”的输入错误,当我尝试按照本文中的步骤操作时,我也没有得到所描述的结果,并且列表框肯定没有填充


您可能想看看它提到的SourceForge VCL项目。我自己也没有尝试过,但它看起来比我预想的要复杂得多,尽管我不知道这是否是因为它是针对XE2的,而LiveBindings从那时起就开始发展了。我确实看过DFM,我从来没有想到表达式属性会给出它们的值,无论是从第一原理还是文章中所说的。我尝试在我的项目中使用它们,但列表框仍然是空的。

事实上,所有文档和博客帖子都使用不存在的TBindScope,包括您提到的svn项目。我将尝试TLinkListControlToField建议,并将报告结果。这是否对您有效,或者您是否仍有问题?没有人无法使其正常工作。我暂时搁置了它,并编写了手动更新comboedit列表的代码
procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  CDS1.IndexFieldNames := 'ID';
  CDS1.CreateDataSet;

  for i := 1 to 6 do begin
    CDS1.Insert;
    CDS1.FieldByName('Name').AsString := 'Name  ' + IntToStr(i);;
    CDs1.FieldByName('Value').AsString := 'Value  ' + IntToStr(i);
    CDS1.Post;
  end;

  CDS1.First;
  StringGrid1.Invalidate;
end;

procedure TForm1.CDS1NewRecord(DataSet: TDataSet);
begin
  Inc(NextID);
  DataSet.FieldByName('ID').AsInteger := NextID;
end;
LinkListControlToField1: TLinkListControlToField