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メソッドをオーバーライドして何もしないようにすることができます。ルックアップに使用する2番目のデータセットを作成することもできます。ただし、必要に応じて、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 に答える