是否有人设法让DBLookupComboBox
使用DBCtrlGrid
?
预先填写的DBComboBox
可以正常工作,但它对查找表的效果不佳。
答案 0 :(得分:1)
好吧,我不明白为什么它在Delphi中是禁止的动作,但是我已经设法在ComponentStyle中用csReplicatable
标志创建我自己的查找组合框组件,它可以工作!
它没有经过全面测试,但在我的应用中它没有问题。
Here is the source,请查看。
答案 1 :(得分:0)
我非常谨慎地改变/维护改变的VCL / RTL代码,我找到了另一种方法。在您的单位界面中声明以下内容:
interface
uses
...
;
type Tdbp = class(TDBCtrlGrid);
type tdbl = class(TDBLookupControl);
type
TForm4 = class(TForm)
...
DBCtrlGrid1: TDBCtrlGrid;
...
private
...
function FindLCB(DataFieldName: String): TDBLookupComboBox;
procedure FixDBLookupDataLinks;
public
...
end;
...and in your implementation:
----------
implementation
procedure TForm4.FormCreate(Sender: TObject);
begin
...
DBCtrlGrid1.DataSource := DataSource1;
FixDBLookupDataLinks;
end;
procedure TForm4.FixDBLookupDataLinks;
var
lcb: TDBLookupComboBox;
I,n: Integer;
MyDataLink: TDataLink;
ctl: TControl;
dbp: Tdbctrlpanel;
begin
dbp := Tdbp(DBControlGrid1).Panel;
for n := 0 to Pred(dbp.ControlCount) do
begin
ctl := dbp.Controls[n];
if ctl.ClassType = TDBLookupComboBox then
begin
lcb := TDBLookupComboBox(ctl);
lcb.ControlStyle := lcb.ControlStyle + [csReplicatable];
TDBL(lcb).ListLink.DataSourceFixed := False;
for I := 0 to Pred(lcb.ControlCount) do
begin
if lcb.Controls[I] is TPopupDataList then
begin
TDBL(lcb).ListLink.DataSourceFixed := False;
TDBL(lcb).DataLink.DataSourceFixed := False;
MyDataLink := TDataLink(lcb.Controls[I].Perform(CM_GETDATALINK, 0, 0));
if MyDataLink <> nil then
MyDataLink.DataSourceFixed := False;
MyDataLink.DataSource := nil;
end;
end;
end;
end;
end;
function TForm4.FindLCB(DataFieldName: String): TDBLookupComboBox;
var
i: Integer;
begin
Result := Nil;
for i := 0 to Pred(ControlCount) do
if Controls[i].ClassType = TDBLookupComboBox then
if TDBLookupComboBox(Controls[i]).DataField = DataFieldName then
begin
Result := TDBLookupComboBox(Controls[i]);
Break;
end;
end;
答案 2 :(得分:0)
我在Embarcadero Developer Network上找到了此解决方法:
我想出了如何解决这个问题。这是一个例子。它 假设组合框在设计时被放置在网格上,而不是 运行。所以在事件处理程序执行时,控件 已成功从DFM和链接流式传输 成立。虽然应该在一个真实的项目中进行测试。
procedure TForm1.FormCreate(Sender: TObject); var I: Integer; MyDataLink: TDataLink; begin for I := 0 to DBLookupComboBox1.ControlCount - 1 do if DBLookupComboBox1.Controls[I] is TPopupDataList then begin MyDataLink := TDataLink(DBLookupComboBox1.Controls[I].Perform(CM_GETDATALINK, 0, 0)); if MyDataLink <> nil then begin MyDataLink.DataSourceFixed := False; MyDataLink.DataSource := nil; end; end; end;
Andrei Fomine。
如果您的TDBLookupComboBox
上有多个TDBGrid
,则可以使用此代码段:
procedure TForm1.FormCreate(Sender: TObject);
var
I, C: Integer;
curCombo: TDBLookupComboBox; curDL: TDataLink;
begin
for C := 0 to ComponentCount - 1 do begin
if Components[C] is TDBLookupComboBox then begin
curCombo:= (Components[C] as TDBLookupComboBox);
for I := 0 to curCombo.ControlCount - 1 do
if curCombo.Controls[I] is TPopupDataList then
begin
curDL := TDataLink(curCombo.Controls[I].Perform(CM_GETDATALINK, 0, 0));
if curDL <> nil then begin
curDL.DataSourceFixed := False;
curDL.DataSource := nil;
end;
end;
end;
end;
end;
答案 3 :(得分:-2)
我刚刚向TDBLookupCombo
添加了TDBCtrlGrid
。当我尝试设置ListSource
时,我收到错误:
DBCtrlGrid中不允许操作。
因此,似乎在Delphi中明确禁止这样做,因此您将无法执行此操作。