有没有办法用数据库列中的项填充TListbox
控件?
我知道正确的方法是简单地使用DBLookupListbox
控件并将其设置为访问我想要的列,但问题是当我点击查找中的一个项目时控制,它会更改数据集中的当前行(预期行为),但我不希望这种情况发生。
相反,我希望仅在查找控件中的双击事件上更改当前行,因为我认为这种行为不可能改变,我认为简单地使用普通{{}会更容易1}}相反,但正如我上面所说,我不确定它是如何完成的。
因此,我再次向专家们提出了一些建议,告诉他们如何使用数据库列中的项填充普通TListBox
控件。
答案 0 :(得分:4)
您没有指定DB正在使用的组件,因此我使用ADO和MySQL编写了此示例。
const
StrConnection='Driver={MySQL ODBC 5.1 Driver};Server=%s;Database=%s;User=%s; Password=%s;Option=3;';
procedure LoadColumn(Items:TStrings; const SqlStr :string);
Var
AdoDataSet : TADODataSet;
begin
AdoDataSet:=TADODataSet.Create(nil);
try
//you can share the connection too, in this case a new connection is made
AdoDataSet.ConnectionString:=Format(StrConnection,['server','mydatabase','user','pass']);;
AdoDataSet.CommandText:=SqlStr;
AdoDataSet.Open;
if not AdoDataSet.IsEmpty then
begin
Items.BeginUpdate;
try
Items.Clear;
while not AdoDataSet.Eof do
begin
Items.Add(AdoDataSet.Fields[0].AsString);
AdoDataSet.Next;
end;
finally
Items.EndUpdate;
end;
end;
finally
AdoDataSet.Free;
end;
end;
并使用如此
LoadColumn(ListBox1.Items, 'Select MyColumn FROM Table');
答案 1 :(得分:1)
有很多方法可以解决您的问题。您可以创建对TDbLookupListBox的黑客控制并覆盖Click方法以不执行任何操作。您还可以创建第二个用于查找的数据集。但是如您所愿,要填充TListbox,您只需迭代数据集并将字段值添加到列表框中:
tLogin.first;
while not tLogin.eof do
begin
Listbox1.Items.Add(tLogin.fieldbyname('fullname').asstring);
tLogin.next;
end;
如果您需要基于选择的键值,那么这将无法完全解决您的问题。你最好不要攻击TDbLookupListbox控件,imo。
答案 2 :(得分:0)
使用TDBLookupListBox。使用ListField属性并忽略DataField属性。