有没有一种方法来填充TListbox
与数据库列项的控制?
我知道正确的方式做,这是简单地用一个DBLookupListbox
控制,并将其设置为可访问我想列,但这个问题是,当我点击在查找控制的项目之一,它改变了当前行在数据集(预期的行为),但我不希望这种事情发生。
相反,我想目前的行仅在查找控制双击事件被改变,因为我不认为这种行为是可以改变的,我认为这将是更容易简单地用一个正常TListBox
代替,但作为我上文所述,我不知道它是如何做。
所以再次,我已经走到了专家们关于如何填充一个正常的一些建议Tlistbox
与数据库中列项的控制。
有办法解决你的问题无数。 您可以创建一个TDbLookupListBox的黑客控制并重写的Click方法什么也不做。 你也可以创建第二个数据集用于您的查找。 但是,如你所愿,来填充TListBox中,您只需迭代数据集和字段值添加到列表框中为:
tLogin.first;
while not tLogin.eof do
begin
Listbox1.Items.Add(tLogin.fieldbyname('fullname').asstring);
tLogin.next;
end;
如果您需要根据选择的关键值,那么这将不能完全解决你的问题。 你会关闭黑客TDbLookupListbox控制更好,海事组织。
你不指定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');
使用TDBLookupListBox 。 使用ListField属性,而忽略了数据字段属性。