2016-08-22 51 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

相關問題