数据库列中的Tlistbox项

时间:2012-07-18 22:09:10

标签: database delphi listbox delphi-7

有没有办法用数据库列中的项填充TListbox控件?

我知道正确的方法是简单地使用DBLookupListbox控件并将其设置为访问我想要的列,但问题是当我点击查找中的一个项目时控制,它会更改数据集中的当前行(预期行为),但我不希望这种情况发生。

相反,我希望仅在查找控件中的双击事件上更改当前行,因为我认为这种行为不可能改变,我认为简单地使用普通{{}会更容易1}}相反,但正如我上面所说,我不确定它是如何完成的。

因此,我再次向专家们提出了一些建议,告诉他们如何使用数据库列中的项填充普通TListBox控件。

3 个答案:

答案 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属性。