Database 数据库列中的Tlistbox项
有没有办法用数据库列中的项目填充TListbox控件 我知道正确的方法是简单地使用DBLookupListbox控件并将其设置为访问我想要的列,但问题是当我单击lookup控件中的一个项时,它会更改数据集中当前行的预期行为,但我不希望发生这种情况 相反,我希望当前行仅在lookup控件中的双击事件中更改,并且由于我认为这种行为不可能更改,因此我认为简单地使用普通的TListBox会更容易,但是如上所述,我不确定它是如何完成的Database 数据库列中的Tlistbox项,database,delphi,listbox,delphi-7,Database,Delphi,Listbox,Delphi 7,有没有办法用数据库列中的项目填充TListbox控件 我知道正确的方法是简单地使用DBLookupListbox控件并将其设置为访问我想要的列,但问题是当我单击lookup控件中的一个项时,它会更改数据集中当前行的预期行为,但我不希望发生这种情况 相反,我希望当前行仅在lookup控件中的双击事件中更改,并且由于我认为这种行为不可能更改,因此我认为简单地使用普通的TListBox会更容易,但是如上所述,我不确定它是如何完成的 因此,我再次向专家请教如何用数据库列中的项目填充普通的Tlistbox
因此,我再次向专家请教如何用数据库列中的项目填充普通的Tlistbox控件。使用。使用ListField属性并忽略DataField属性。使用。使用ListField属性而忽略DataField属性。解决问题的方法有很多种。您可以创建一个被黑客攻击的TDbLookupListBox控件,并重写Click方法以不执行任何操作。您还可以创建用于查找的第二个数据集。但如您所愿,要填充TListbox,只需迭代数据集并将字段值添加到listbox,如下所示:
tLogin.first;
while not tLogin.eof do
begin
Listbox1.Items.Add(tLogin.fieldbyname('fullname').asstring);
tLogin.next;
end;
如果需要基于选择的键值,那么这并不能完全解决问题。在我看来,你最好还是破解TDbLookupListbox控件。有很多方法可以解决你的问题。您可以创建一个被黑客攻击的TDbLookupListBox控件,并重写Click方法以不执行任何操作。您还可以创建用于查找的第二个数据集。但如您所愿,要填充TListbox,只需迭代数据集并将字段值添加到listbox,如下所示:
tLogin.first;
while not tLogin.eof do
begin
Listbox1.Items.Add(tLogin.fieldbyname('fullname').asstring);
tLogin.next;
end;
如果需要基于选择的键值,那么这并不能完全解决问题。您最好还是破解TDbLookupListbox控件,imo.您没有指定正在使用的组件,因此我使用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');
您没有指定正在使用的组件,所以我使用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');
我删除了binding标记,因为它在delphixe和更高版本的LiveBindings中有特定的含义,您的问题不是关于这个含义。另外,只是为了确保:您知道您正在寻找的行为是不标准的,并且会让用户感到困惑?列表框的正常行为是单击某个值以选择该值;如果您不希望用户通过这样做来更改它,请禁用列表框,使其无法更改,或者不要首先将数据库置于编辑模式,使其无法修改。我删除了绑定标记,因为这在Delphi XE及更高版本的LiveBindings中具有特定的含义,而您的问题与此无关。另外,只是为了确保:您知道您正在寻找的行为是不标准的,并且会让用户感到困惑?列表框的正常行为是单击某个值以选择该值;如果您不希望用户通过这样做来更改它,禁用列表框,使其无法更改,或者不首先将数据库置于编辑模式,使其无法修改。我已经这样做了,并且在lookuplistbox中选择项目时,它仍会更改当前行。您可以创建第二个数据集,以便与lookup控件一起使用。我已经这样做了,它仍会更改当前行行。您可以创建第二个数据集用于查找控件。最后我做了类似的事情,我只是在表单中添加了另一个数据源组件,将查找控件绑定到该组件,并禁用了原始数据源控件。然后,每当需要查看其他字段时,通过双击查找控件中的某个项,我就会重新启用原始数据源控件。丑陋,但它可以完成任务。请记住在列表框中调用BeginUpdate、EndUpdate方法。TDataset中的Items和DisableControls、EnableControls。最后我做了类似的事情,我只是在表单中添加了另一个数据源组件,将查找控件绑定到该组件,并禁用了原始数据源控件。然后,每当需要查看其他字段时,通过双击查找控件中的某个项,我就会重新启用原始数据源控件。丑陋,但它可以完成任务。记住在列表框中调用BeginUpdate、EndUpdate方法。TDataset中的Items和DisableControls、EnableControls。我使用的是绝对数据库组件,我使用的是另一种方法。感谢您花时间回复并提供示例。我确信它对其他人会有用。我使用的是绝对数据库组件,我使用的是另一种方法。感谢您花时间回复并提供示例。我相信这会对其他人有用。