即使你大大改善q,我一直无法重现你的错误报告 ,以便必须由您正在做的事情引起,这些事情仍然存在你q。但是,现在我已经对你想要做的事情有了更好的了解,我确实有一个完全正常的测试项目,并且我已经包含尽可能多的 你需要它自己设立一个类似的项目。
在我看来,无论你和你的项目出现错误的,是注定要失败的 由于以下原因:
- 由于您GridDataSet SELECT语句不包括在员工的DEPID值 行,这是无法在服务器上更新并随后检索的。
所以,我的版本不包括在SELECT语句 员工DEPID列,我已经包含在cxGrid它一列,以便更容易看到发生了什么要去 - 很明显,你可以隐藏或者省略cxGrid中的DepID列。
项目通常无法按预期工作,因为设置掩埋在对象检查器 中,尤其是对象与cxGrid一样复杂。为了避免这种情况,并证明我的项目实际工作,我已经完成了几乎所有的代码,包括创建 并填充Employee和Department表并设置lookupcombobox
。 我在代码中没有做的唯一事情就是创建cxGrid列,因为那是 太令人厌烦了 - 这就是我所包含的DFM提取内容。
代码提取
const
scCreateData =
'create table Employee'#13#10
+ '(EmpID int primary key,'#13#10
+ 'EmpName nvarchar(10),'#13#10
+ 'DepID int)'#13#10
+ ''#13#10
+ 'create table Department'#13#10
+ '(DepID int primary key,'#13#10
+ 'DepartmentName nvarchar(10)'#13#10
+ ')'#13#10
+ ''#13#10
+ 'insert Employee(EmpID, EmpName, DepID) values (1, ''Joe Blow'', 1)'#13#10
+ 'insert Employee(EmpID, EmpName, DepID) values (2, ''Jane Doe'', 2)'#13#10
+ ''#13#10
+ 'insert Department(DepID, DepartmentName) values(1, ''HR'')'#13#10
+ 'insert Department(DepID, DepartmentName) values(2, ''Other'')'#13#10
;
scGetGridData =
'SELECT e.EmpID, e.EmpName, e.DepID, D.DepartmentName FROM Employee e'#13#10
+ 'INNER JOIN Department d ON d.DepID = E.DepID';
scGetLookUpData = 'Select * from Department';
procedure TForm1.FormCreate(Sender: TObject);
begin
// Create Grid and Lookup tables and populate them
GridDataSet.SQL.Text := scCreateData;
GridDataSet.ExecSQL;
LookUpDataSet.SQL.Text := scGetLookUpData;
LookUpDataSet.Open;
GridDataSet.SQL.Text := scGetGridData;
GridDataSet.Open;
// Set up lookupcombo on DepartmentName column
cxGrid1DBTableView1DepartmentName.PropertiesClass := TcxLookUpComboBoxProperties;
TcxLookUpComboBoxProperties(cxGrid1DBTableView1DepartmentName.Properties).KeyFieldNames := 'DepartmentName';
TcxLookUpComboBoxProperties(cxGrid1DBTableView1DepartmentName.Properties).ListFieldNames := 'DepID;DepartmentName';
TcxLookUpComboBoxProperties(cxGrid1DBTableView1DepartmentName.Properties).ListFieldIndex := 1;
TcxLookUpComboBoxProperties(cxGrid1DBTableView1DepartmentName.Properties).ListSource := dsLookUpDataSet;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// Tidyup WARNING - drops tables
GridDataSet.Close;
GridDataSet.SQL.Text := 'drop table Employee';
GridDataSet.ExecSql;
GridDataSet.SQL.Text := 'drop table Department';
GridDataSet.ExecSql;
end;
DFM从通过如下方法的细胞获得LookupComboBox提取
object cxGrid1DBTableView1: TcxGridDBTableView
Navigator.Buttons.CustomButtons = <>
DataController.DataSource = dsGridDataSet
DataController.Summary.DefaultGroupSummaryItems = <>
DataController.Summary.FooterSummaryItems = <>
DataController.Summary.SummaryGroups = <>
object cxGrid1DBTableView1EmpID: TcxGridDBColumn
DataBinding.FieldName = 'EmpID'
end
object cxGrid1DBTableView1EmpName: TcxGridDBColumn
DataBinding.FieldName = 'EmpName'
end
object cxGrid1DBTableView1DepID: TcxGridDBColumn
DataBinding.FieldName = 'DepID'
end
object cxGrid1DBTableView1DepartmentName: TcxGridDBColumn
DataBinding.FieldName = 'DepartmentName'
PropertiesClassName = 'TcxLookupComboBoxProperties'
Properties.KeyFieldNames = 'DepartmentName'
Properties.ListColumns = <
item
FieldName = 'DepID'
end
item
FieldName = 'DepartmentName'
end>
Properties.ListFieldIndex = 1
Properties.ListSource = dsLookUpDataSet
end
end
因此,字面回答您的问与答
除了有任何其他方式?
是你不需要另一种方式,只要确保你的SELECT语句检索你需要的所有数据,然后正确配置lookupcombobox
。
原始回答如下:我会编辑它或一旦我知道 新版本适合你。
您没有在q中提供足够的信息来重现您遇到的问题 ,也没有明确指出错误在哪里(在您的代码中)出现。
因此,以下是最好的解决方法,并且基于这样的想法,即您可以使用组合框代替LookupComboBox并在代码中自行填充它。
试试这个:
代码
// In the following, my column's db fieldname is "Value"
cxGrid1DBTableView1Value.PropertiesClass := TcxComboBoxProperties;
TcxComboBoxProperties(cxGrid1DBTableView1Value.Properties).Items.Add('One');
TcxComboBoxProperties(cxGrid1DBTableView1Value.Properties).Items.Add('Two');
TcxComboBoxProperties(cxGrid1DBTableView1Value.Properties).Items.Add('Three');
在运行时,您应该看到一个包含条目“One”,“Two”,“Three”的下拉列表。
很显然,如果你想组合框列出依赖于 当前cxGrid数据行的数据值的值,则需要清除组合框Items
列表,并重新填充 当你的网格的数据集卷轴(使用其AfterScroll
事件)。你从哪里得到的值要添加到Items
列表完全取决于你。
如果你不想使用,而不是一个LookUpComboBox一个ComboBox,那么我可以 建议最好是将跟踪LookUpComboBox类型的工作示例的代码 列的属性,看看你是否可以模仿它在你自己的代码中做了什么。 这或者调试你遇到的实际问题,因为读者不能为你做到这一点!
更新
我找的地方我能够LookupComboBox上CXGrid
我使用的数据集的单元的例子有两个字母的字段“国家代码'。 FormCreate
中的以下附加代码将在连接到TClientDataSet的列中添加LookUpCombo cdsCountry
。
cdsCountry.FieldDefs.Add('CountryCode', ftString, 2);
cdsCountry.FieldDefs.Add('CountryName', ftString, 80);
cdsCountry.CreateDataSet;
cdsCountry.InsertRecord(['', '']);
cdsCountry.InsertRecord(['GB', 'United Kingdom']);
cdsCountry.InsertRecord(['FR', 'France']);
cdsCountry.InsertRecord(['DE', 'Germany']);
cxGrid1DBTableView1CountryCode.PropertiesClass := TcxLookUpComboBoxProperties;
TcxLookUpComboBoxProperties(cxGrid1DBTableView1CountryCode.Properties).KeyFieldNames := 'CountryCode';
TcxLookUpComboBoxProperties(cxGrid1DBTableView1CountryCode.Properties).ListFieldNames := 'CountryCode;CountryName';
TcxLookUpComboBoxProperties(cxGrid1DBTableView1CountryCode.Properties).ListSource := dsCountry;
“......,因此......”我不能马上明白为什么你是从多表填充电网的事实加盟应导致的‘错误’。在任何情况下,你都不会说错误是什么,所以读者如何能够帮助这么少的事情继续下去。我认为你应该向你的q添加以下细节:a)用于填充网格的SQL连接的细节,b)填充lookupcombo的设置和c)错误消息的**精确**文本(s )。 – MartynA
@MartynA 这是其中一个错误 “'无法将类型(UnicodeString)的变体转换为类型(布尔)'” 顺便说一句,如果您可以共享任何替代方法,那就太好了。 一些类似的方式:[链接](http://www.nsonic.de/blog/2007/05/adding-a-combobox-to-a-cell/) 只是一个笔记,我不想改变目前的工作即参考加入。 – mano
对不起,如果读者不得不猜测你在q,f.i中未提供的相关细节,那么你不能期待帮助。 combobox用于的db字段的数据类型。 – MartynA