将LookupComboBox添加到CXGrid单元格

时间:2016-08-22 10:34:26

标签: delphi delphi-xe

除了通过下面给出的方法在单元格上获取LookupComboBox之外还有其他方法吗? -Select a column -From Properties select LookupComboBox -fill out the required data suchas listsource, listfieldnames etc

寻找替代解决方案背后的原因是我通过连接多个表来获取CXGrid中的数据,因此当我使用上述方法时,我会遇到错误

我正在寻找一个例子,我可以在CXGrid的一个单元格上使用LookupComboBox,帮助!!

Updated Question

根据以下建议,我试图重新构建我的问题,我认为现在应该有意义

我有一个表Employee and Department

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进行编辑 从而 - 选择一列(DepartmentName) -From Properties选择LookupComboBox - 填写所需的数据,例如listsource,listfieldnames等 这里是ListSource是另一个数据集,它引用了部门,KeyFieldName为DepID

使用所有这些设置当我尝试通过执行GridDataset.open来查看cxgrid中的数据时,我收到以下错误消息 “无法将类型(UnicodeString)的变体转换为类型(布尔)”

1 个答案:

答案 0 :(得分:1)

即使您的q得到了很大改善,我也无法重现您报告的错误 因此,必须由你正在做的事情引起,而你的q仍然缺失。

然而,既然我已经更好地了解了你正在尝试做什么,我确实有一个全面运作的测试项目,而且我已尽可能多地考虑我的想法 你自己需要它来建立一个类似的项目。

在我看来,无论你的项目出现什么错误,它都注定要失败 由于以下原因失败:

  • 由于您的GridDataSet SELECT语句不包含Employee中的DepID值 行,那里无法在服务器上更新并随后检索。

因此,我的版本 包含SELECT语句中的Employee DepID列 并且我在cxGrid中添加了一个列,以便更容易看到它的内容 on - 显然你可以隐藏或省略cxGrid中的DepID列。

由于隐藏在Object Inspector中的设置,项目通常无法按预期工作 特别是对象与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

所以,你的q

的字面答案
  

除了通过下面给出的方法在单元格上获取LookupComboBox之外还有其他方法吗?

您不需要其他方式,只需确保SELECT语句检索所需的所有数据,然后正确配置lookupcombobox

原始答案如下:我知道后我会将其编辑或删除 新版本适合您。

您还没有在q中提供足够的信息来重现 您遇到的问题,也没有明确说明错误出现在哪里(在您的代码中)。

因此,以下内容充其量只是一种解决方案,并且基于您可以的想法 使用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');

在运行时,您应该会看到一个下拉列表,其中包含条目&#34; One&#34;,&#34; Two&#34;,&#34; Three&#34;。

显然,如果你想让组合框列出依赖于数据值的值 当前的cxGrid数据行,您需要清除组合框Items列表并重新填充 当您的网格数据集滚动时(使用其AfterScroll事件)。从哪里获取值以添加到Items列表完全取决于您。

如果您不想使用ComboBox而不是LookUpComboBox,那么我能做到最好 建议是跟踪LookUpComboBox类型的工作示例的代码 列的属性,看看你是否可以模仿它在你自己的代码中的作用。 那,或调试你遇到的实际问题,因为读者无法为你做到这一点!

<强>更新

  

我正在寻找一个示例,我可以在CXGrid的单元格上使用LookupComboBox

我使用的数据集有一个双字符字段,&#39; CountryCode&#39;。 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;