1

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

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

相反,我希望仅在查找控件中的双击事件上更改当前行,并且由于我认为这种行为不可能改变,我认为简单地使用普通TListBox代替会更容易,但是因为我如上所述,我不确定它是如何完成的。

因此,我再次向专家寻求有关如何Tlistbox使用数据库列中的项目填充正常控件的一些建议。

4

3 回答 3

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');
于 2012-07-19T00:43:52.200 回答
1

有无数种方法可以解决您的问题。您可以创建一个 TDbLookupListBox 的黑客控制并覆盖 Click 方法以不执行任何操作。您还可以创建第二个数据集用于查找。但如您所愿,要填充 TListbox,您只需迭代数据集并将字段值添加到列表框,如下所示:

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

如果您需要基于选择的键值,那么这不会完全解决您的问题。你最好不要破解 TDbLookupListbox 控件,imo。

于 2012-07-19T00:17:02.180 回答
0

使用TDBLookupListBox。使用 ListField 属性并忽略 DataField 属性。

于 2012-07-18T23:01:31.477 回答