将 LookupComboBox 添加到 CXGrid 单元格
Adding a LookupComboBox to a CXGrid cell
除了通过下面给定的方法在单元格上获取 LookupComboBox 之外,还有其他方法吗?
-Select a column
-From Properties select LookupComboBox
-fill out the required data suchas listsource, listfieldnames etc
寻找替代解决方案的原因是我通过连接多个 table 在 CXGrid 中获取数据,因此当我使用上述方法时我 运行 出错
我正在寻找一个可以在 CXGrid 的单元格上查找组合框的示例,求救!!
Updated Question
根据以下建议,我尝试重新构建我的问题,我认为这现在应该有意义了
我有一个table员工和部门
Employee
EmpID, EmpName, DepID
Department
DepID, DepartmentName
所以在cxGrid中我想要的是
EmpID, EmpName, DepartmentName
因此提供给 GridDataset 以获取数据的查询是
SELECT EmpID, EmpName, DepartmentName FROM Employee
INNER JOIN Department ON Department.DepID = Employee.DepID
下一步是 CXGrid 中的 DepartmentName 字段应该通过 lookupcombobox 编辑table
因此
-Select 一列(部门名称)
-从属性 select LookupComboBox
-填写所需的数据,如listsource、listfieldnames等
这里的 ListSource 是另一个数据集,它引用 Department 的 KeyFieldName 作为 DepID
使用所有这些设置,当我尝试通过 GridDataset.open 查看 cxgrid 中的数据时,我收到以下错误消息
"Could not convert variant of type (UnicodeString) into type (Boolean)"
即使你的 q 有了很大的改进,我也无法重现你报告的错误
所以这一定是你正在做的事情引起的,而你的问题仍然没有。
但是,既然我对您要尝试做的事情有了更好的了解,我确实有一个可以正常工作的测试项目,并且我已经包含了我认为的所有内容
您将需要它来自己建立一个类似的项目。
在我看来,无论您在项目中遇到什么错误,都注定
失败原因如下:
- 由于您的 GridDataSet SELECT 语句不包含 Employee 中的 DepID 值
行,无法在服务器上更新并随后检索。
因此,我的版本 确实 在 SELECT 语句中包含了 Employee DepID 列
并且我在 cxGrid 中包含了一个专栏,以便更容易看到发生了什么
on - 显然您可以隐藏或省略 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 提取
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
所以,你的问题的字面答案
Apart from getting LookupComboBox on a cell via the below given method is there any other way?
是你不需要其他方式,只要确保你的SELECT语句检索到你需要的所有数据,然后正确配置lookupcombobox
即可。
原回答如下:一旦我知道我会把它编辑下来或删掉
新版本适合你。
您没有在您的问题中提供足够的信息来重现
您遇到的问题,也没有明确指出(在您的代码中)错误出现的位置。
因此,以下充其量只是一种解决方法,并且基于您可以
使用 ComboBox 而不是 LookupComboBox 并在代码中自行填充它。
试试这个:
将您的 cxGrid 列的 Properties
设置为 ComboBox
在您的 FormCreate 事件中,添加以下代码
代码
// 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
列表的值完全取决于您。
如果您不想使用 ComboBox 而不是 LookUpComboBox,那么我会尽力而为
建议是跟踪 LookUpComboBox 类型的工作示例的代码
列的属性,看看您是否可以在自己的代码中模仿它的作用。
那,或者调试你遇到的实际问题,因为读者不能为你做那件事!
更新
i am looking for a example where i am able to LookupComboBox on a cell of CXGrid
我使用的数据集有两个字符的字段,'CountryCode'。 FormCreate
中的以下附加代码将在连接到 TClientDataSet cdsCountry
.
的列中添加 LookUpCombo
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;
除了通过下面给定的方法在单元格上获取 LookupComboBox 之外,还有其他方法吗?
-Select a column
-From Properties select LookupComboBox
-fill out the required data suchas listsource, listfieldnames etc
寻找替代解决方案的原因是我通过连接多个 table 在 CXGrid 中获取数据,因此当我使用上述方法时我 运行 出错
我正在寻找一个可以在 CXGrid 的单元格上查找组合框的示例,求救!!
Updated Question
根据以下建议,我尝试重新构建我的问题,我认为这现在应该有意义了
我有一个table员工和部门
Employee
EmpID, EmpName, DepID
Department
DepID, DepartmentName
所以在cxGrid中我想要的是
EmpID, EmpName, DepartmentName
因此提供给 GridDataset 以获取数据的查询是
SELECT EmpID, EmpName, DepartmentName FROM Employee
INNER JOIN Department ON Department.DepID = Employee.DepID
下一步是 CXGrid 中的 DepartmentName 字段应该通过 lookupcombobox 编辑table 因此 -Select 一列(部门名称) -从属性 select LookupComboBox -填写所需的数据,如listsource、listfieldnames等 这里的 ListSource 是另一个数据集,它引用 Department 的 KeyFieldName 作为 DepID
使用所有这些设置,当我尝试通过 GridDataset.open 查看 cxgrid 中的数据时,我收到以下错误消息 "Could not convert variant of type (UnicodeString) into type (Boolean)"
即使你的 q 有了很大的改进,我也无法重现你报告的错误 所以这一定是你正在做的事情引起的,而你的问题仍然没有。
但是,既然我对您要尝试做的事情有了更好的了解,我确实有一个可以正常工作的测试项目,并且我已经包含了我认为的所有内容 您将需要它来自己建立一个类似的项目。
在我看来,无论您在项目中遇到什么错误,都注定 失败原因如下:
- 由于您的 GridDataSet SELECT 语句不包含 Employee 中的 DepID 值 行,无法在服务器上更新并随后检索。
因此,我的版本 确实 在 SELECT 语句中包含了 Employee DepID 列 并且我在 cxGrid 中包含了一个专栏,以便更容易看到发生了什么 on - 显然您可以隐藏或省略 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 提取
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
所以,你的问题的字面答案
Apart from getting LookupComboBox on a cell via the below given method is there any other way?
是你不需要其他方式,只要确保你的SELECT语句检索到你需要的所有数据,然后正确配置lookupcombobox
即可。
原回答如下:一旦我知道我会把它编辑下来或删掉 新版本适合你。
您没有在您的问题中提供足够的信息来重现
您遇到的问题,也没有明确指出(在您的代码中)错误出现的位置。
因此,以下充其量只是一种解决方法,并且基于您可以 使用 ComboBox 而不是 LookupComboBox 并在代码中自行填充它。
试试这个:
将您的 cxGrid 列的
Properties
设置为ComboBox
在您的 FormCreate 事件中,添加以下代码
代码
// 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
列表的值完全取决于您。
如果您不想使用 ComboBox 而不是 LookUpComboBox,那么我会尽力而为 建议是跟踪 LookUpComboBox 类型的工作示例的代码 列的属性,看看您是否可以在自己的代码中模仿它的作用。 那,或者调试你遇到的实际问题,因为读者不能为你做那件事!
更新
i am looking for a example where i am able to LookupComboBox on a cell of CXGrid
我使用的数据集有两个字符的字段,'CountryCode'。 FormCreate
中的以下附加代码将在连接到 TClientDataSet 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;