即使你大大改善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