2016-08-22 24 views
2

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

为寻找一种替代解决方案就是我通过连接多个表和获取在CXGrid数据背后的原因因而当我使用上述方法,然后我遇到错误

我寻找一个例子,其中i我能够在CXGrid的单元格上查找组合框,帮助!

Updated Question

通过以下建议,我曾试图重制帧我的问题,我想这应该是有意义现在

我有一个表Employee和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) - 从属性选择LookupComboBox -fill出所需要的数据suchas listsource,listfieldnames等 这里是ListSource是它指的部门与KeyFieldName为DEPID

这一切的设置,当我尝试做在cxgrid查看数据的其他数据集GridDataset.open然后我得到以下错误消息 “无法转换类型(的UnicodeString)的变体进入式(布尔)”

+1

“......,因此......”我不能马上明白为什么你是从多表填充电网的事实加盟应导致的‘错误’。在任何情况下,你都不会说错误是什么,所以读者如何能够帮助这么少的事情继续下去。我认为你应该向你的q添加以下细节:a)用于填充网格的SQL连接的细节,b)填充lookupcombo的设置和c)错误消息的**精确**文本(s )。 – MartynA

+0

@MartynA 这是其中一个错误 “'无法将类型(UnicodeString)的变体转换为类型(布尔)'” 顺便说一句,如果您可以共享任何替代方法,那就太好了。 一些类似的方式:[链接](http://www.nsonic.de/blog/2007/05/adding-a-combobox-to-a-cell/) 只是一个笔记,我不想改变目前的工作即参考加入。 – mano

+0

对不起,如果读者不得不猜测你在q,f.i中未提供的相关细节,那么你不能期待帮助。 combobox用于的db字段的数据类型。 – MartynA

回答

1

即使你大大改善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并在代码中自行填充它。

试试这个:

  • 设置你的cxGrid列的PropertiesComboBox

  • 在你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列表完全取决于你。

如果你不想使用,而不是一个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; 

+0

我非常感谢您花费宝贵的时间。 在SO中发布之前,我尝试了上述两种解决方案。 我正在尝试我的身边。 谢谢。 – mano

+0

当我将KeyFieldName从DepID更改为Description时,它得到了解决。 Thankyou – mano

相关问题