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