从数据库列的TListBox项目(Tlistbox items from database colu

2019-09-19 17:41发布

有没有一种方法来填充TListbox与数据库列项的控制?

我知道正确的方式做,这是简单地用一个DBLookupListbox控制,并将其设置为可访问我想列,但这个问题是,当我点击在查找控制的项目之一,它改变了当前行在数据集(预期的行为),但我不希望这种事情发生。

相反,我想目前的行仅在查找控制双击事件被改变,因为我不认为这种行为是可以改变的,我认为这将是更容易简单地用一个正常TListBox代替,但作为我上文所述,我不知道它是如何做。

所以再次,我已经走到了专家们关于如何填充一个正常的一些建议Tlistbox与数据库中列项的控制。

Answer 1:

有办法解决你的问题无数。 您可以创建一个TDbLookupListBox的黑客控制并重写的Click方法什么也不做。 你也可以创建第二个数据集用于您的查找。 但是,如你所愿,来填充TListBox中,您只需迭代数据集和字段值添加到列表框中为:

tLogin.first;
while not tLogin.eof do
begin
  Listbox1.Items.Add(tLogin.fieldbyname('fullname').asstring);
  tLogin.next;
end;

如果您需要根据选择的关键值,那么这将不能完全解决你的问题。 你会关闭黑客TDbLookupListbox控制更好,海事组织。



Answer 2:

你不指定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');


Answer 3:

使用TDBLookupListBox 。 使用ListField属性,而忽略了数据字段属性。



文章来源: Tlistbox items from database column