2015-03-31 156 views
3

我想在Combobox下拉列表中显示FirstName和LastName。
问题是我应该在表中存在的2个字段上工作。
我检查了TDBlLookUpComboBox,但ListFields属性在Delphi Xe中对我无效。在ComboBox中显示多个列内容

我设置TDBlLookUpComboBox的性能

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); 
+3

在你的选择你应该这样做。这是更容易 – EProgrammerNotFound 2015-03-31 14:10:10

回答

2

改变输入
只要改变源数据进入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

测试| test
line2 | part2
line 4 |第三部分
线6

而这正是将显示: enter image description here