在组合框中显示多个列内容

问题描述 投票:0回答:2

我想在组合框下拉列表中显示名字和姓氏。
问题是我应该处理表中存在的 2 个字段。
我检查了 TDBlLookUpComboBox,但 ListFields 属性在 Delphi Xe 中对我不起作用。

我将 TDBLookUpComboBox 的属性设置为

DataSource :my datasource
ListFields : SUR_NAME;  FIRST_NAME

现在,我正在用基本的方式来做:

nameClient := Concat( sqlqry1.Fields.FieldByName('FIRST_NAME').AsString,' ',
                      sqlqry1.Fields.FieldByName('SUR_NAME').AsString);
cbbClient.Items.Add(nameClient); 
delphi delphi-xe
2个回答
4
投票

更改输入
只需通过输入查询来更改进入 DBCombo 的源数据即可:

select concat(SUR_NAME,' ',FIRST_NAME) as NAME, * from mytable;

现在您可以在组合框中显示数据。

使输出在组合框中看起来不错
显然您会使用

TDBILookUpComboBox
,但其他一切都是一样的。

为了在下拉列表中制作多列,您必须自己绘制。

这可以通过将

style
更改为
csOwnerDrawFixed
并分配
OnDrawItem
事件来完成。

请参阅下面的示例代码:

unit Unit18;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm18 = class(TForm)
    ComboBox1: TComboBox;
    procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
  private
  public
  end;

var
  Form18: TForm18;

implementation

uses
  System.Types,
  StrUtils;

{$R *.dfm}

procedure TForm18.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Columns: TStringDynArray;
  ColCount: Integer;
  ItemText: string;
  DC: HDC;
  DrawRect: TRect;
  Middle: integer;
begin
  ItemText:= ComboBox1.Items[index];
  Columns:= SplitString(ItemText, '|');
  ColCount:= Length(Columns);

  // For Demo purposes only the first 2 columns are displayed.
  DC:= ComboBox1.Canvas.Handle;
  Combobox1.Canvas.FillRect(Rect);
  Middle:= Rect.Left + Rect.Width div 2;
  Combobox1.Canvas.MoveTo(Middle, Rect.Top);
  Combobox1.Canvas.LineTo(Middle, Rect.Bottom);
  if ColCount > 0 then begin
    DrawRect:= Rect;
    OffsetRect(DrawRect,1,0);
    DrawRect.Right:= DrawRect.Right - DrawRect.Width div 2;
    DrawText(DC, Columns[0], Length(Columns[0]), DrawRect, 0);
  end;
  if ColCount > 1 then begin
    DrawRect:= Rect;
    OffsetRect(DrawRect,1,0);
    DrawRect.Left:= DrawRect.Left + DrawRect.Width div 2;
    DrawText(DC, Columns[1], Length(Columns[1]), DrawRect, 0);
  end;
end;

end.

将以下文字放入

Items

测试 |测试
第 2 行 |第2部分
4 号线 |第 3 部分
6号线

这就是将显示的内容: enter image description here


0
投票

对我来说,TDBLookupComboBox 是最简单的解决方案 - 即使不与外部数据集关联也是如此。

创建ClientDataSet,通过FieldDefs定义字段,随后可以通过代码添加数据。

ClientDataSet1.CreateDataSet;
ClientDataSet1.Open;
with ClientDataSet do
  begin
    Append;
    Fields[0].AsString := {string};
    Fields[1].AsString := {string};
    //etc.
    Post;
    Append;
    Fields[0].AsString := {string};
    Fields[1].AsString := {string};
    //etc.
    Post;
    //etc.
  end;

因此,DBLookupComboBox 的属性 ListSource、ListField(可能包括“field1;field2;field3”)和 KeyField 是对应于 ClientDataSet 定义的,属性 DataSource 和 DataField 可以留空。 因此你就有了多列组合框。 检索选定的项目可以绘制为:

Procedure DBLookupComboBox1CloseUp(Sender: TObject);
zStringOut := DBLookupComboBox1.ListSource.DataSet.Fields[n].AsString;

其中 zStringOut 可以根据需要传递给其他过程。

致以诚挚的问候

© www.soinside.com 2019 - 2024. All rights reserved.