Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 数据库列中的Tlistbox项_Database_Delphi_Listbox_Delphi 7 - Fatal编程技术网

Database 数据库列中的Tlistbox项

Database 数据库列中的Tlistbox项,database,delphi,listbox,delphi-7,Database,Delphi,Listbox,Delphi 7,有没有办法用数据库列中的项目填充TListbox控件 我知道正确的方法是简单地使用DBLookupListbox控件并将其设置为访问我想要的列,但问题是当我单击lookup控件中的一个项时,它会更改数据集中当前行的预期行为,但我不希望发生这种情况 相反,我希望当前行仅在lookup控件中的双击事件中更改,并且由于我认为这种行为不可能更改,因此我认为简单地使用普通的TListBox会更容易,但是如上所述,我不确定它是如何完成的 因此,我再次向专家请教如何用数据库列中的项目填充普通的Tlistbox

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

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

相反,我希望当前行仅在lookup控件中的双击事件中更改,并且由于我认为这种行为不可能更改,因此我认为简单地使用普通的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。我使用的是绝对数据库组件,我使用的是另一种方法。感谢您花时间回复并提供示例。我确信它对其他人会有用。我使用的是绝对数据库组件,我使用的是另一种方法。感谢您花时间回复并提供示例。我相信这会对其他人有用。