【问题标题】:Tlistbox items from database column来自数据库列的 Tlistbox 项
【发布时间】:2012-07-18 22:09:09
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我删除了binding 标签,因为它在Delphi XE 及更高版本(带有LiveBindings)中具有特定含义,而您的问题与该含义无关。另外,只是为了确保:您知道您正在寻找的行为不标准,并且会混淆用户?列表框的正常行为是单击一个值来选择该值;如果您不希望用户通过这样做来更改它,请禁用列表框以使其无法更改(或者不要将数据库置于编辑模式开始,以便他们无法修改它)。跨度>

标签: database delphi listbox delphi-7


【解决方案1】:

你没有指定你正在使用的组件的数据库,所以我使用 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');

【讨论】:

  • 我正在使用绝对数据库组件,并使用另一种方法使其工作。感谢您花时间回复并举例。我相信它对其他人有用。
【解决方案2】:

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

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

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

【讨论】:

  • 最后我做了一些类似的事情,我只是在表单中添加了另一个数据源组件,将查找控件绑定到那个,并禁用了原始数据源控件。然后,只要我需要通过双击查找控件中的项目来查看其他字段,我就会重新启用原始数据源控件。丑陋,但它的工作。
  • 记得在 Listbox.Items 和 DisableControls 上调用 BeginUpdate、EndUpdate 方法,在 TDataset 中调用 EnableControls。
【解决方案3】:

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

【讨论】:

  • 我已经这样做了,当我在查找列表框中选择一个项目时,它仍然会更改当前行。
  • 您可以创建第二个数据集用于查找控件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
相关资源
最近更新 更多