Même avec votre q beaucoup amélioré, je suis incapable de reproduire l'erreur que vous rapport donc cela doit être causé par quelque chose que vous faites qui est toujours absent de yo ur q. Cependant, maintenant que j'ai une meilleure idée de ce que vous essayez de faire, j'ai un projet de test entièrement fonctionnel, et j'en ai inclus autant que je pense, vous en aurez besoin. pour mettre en place un projet similaire.
me semble que quelle que soit l'erreur que vous obtenez avec votre projet, il est voué à l'échec pour la raison suivante:
- Depuis votre déclaration GridDataSet SELECT ne comprend pas la valeur depid dans l'employé ligne, il n'y a aucun moyen que cela pourrait être mis à jour sur le serveur et récupéré par la suite.
Alors, ma version ne inclut la colonne des employés depid dans l'instruction SELECT et je l'ai inclus une colonne dans le cxGrid afin qu'il soit plus facile de voir ce qui se passe sur - évidemment, vous pouvez cacher ou omettez la colonne DepID dans le cxGrid.
Souvent, les projets ne fonctionnent pas comme prévu en raison des paramètres enfouis dans l'inspecteur d'objets en particulier avec des objets aussi complexes que le cxGrid. Pour éviter cela et prouver que mon projet fonctionne réellement, j'ai presque tout fait dans le code, y compris créer et remplir les tables Employee et Department et configurer le lookupcombobox
. La seule chose que je n'ai pas faite dans le code est de créer les colonnes cxGrid, parce que c'était trop fastidieux à faire - c'est ce qui est dans l'extrait DFM que j'ai inclus à la place.
code extrait
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 extrait
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
Donc, la réponse littérale à votre q
En plus d'obtenir LookupComboBox sur une cellule via la méthode ci-dessous donnée est là de toute autre manière?
est que vous n'avez pas besoin d'une autre manière, assurez-vous simplement que votre instruction SELECT récupère toutes les données dont vous avez besoin, puis configurez le lookupcombobox
correctement.
réponse originale suit: Je vais modifier vers le bas ou à l'extérieur une fois que je sais la nouvelle version fonctionne pour vous.
Vous n'avez pas fourni suffisamment d'informations dans votre q pour reproduire le problème que vous rencontrez, ni clairement indiqué d'où provient l'erreur (dans votre code).
Donc ce qui suit est au mieux une solution de rechange, et est basé sur l'idée que vous pouvez utiliser un ComboBox au lieu d'un LookupComboBox et le remplir vous-même dans le code .
Essayez ceci:
Définissez votre de colonne cxGrid Properties
à ComboBox
Dans votre événement FormCreate, ajoutez le code suivant
code
// 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');
Lors de l'exécution, vous devriez voir une liste déroulante contenant les entrées "One", "Two", "Three".
De toute évidence, si vous voulez que la zone de liste déroulante à la liste des valeurs qui dépendent des valeurs de données dans la ligne de données cxGrid actuelle , vous devez effacer la liste combobox Items
et repeupler lorsque les rouleaux du jeu de données de votre réseau (en utilisant son AfterScroll
un événement). L'endroit où vous obtenez les valeurs à ajouter à la liste Items
dépend entièrement de vous.
Si vous ne souhaitez pas utiliser un ComboBox au lieu d'un LookUpComboBox, le mieux que je peux suggérer est de tracer le code d'un exemple de travail du type LookUpComboBox pour les propriétés de la colonne et voir si vous pouvez imiter ce qu'il fait dans le code de votre choix. Cela, ou déboguer le problème que vous rencontrez, parce que les lecteurs ne peuvent pas faire ça pour vous!
Mise à jour
je cherche un exemple où je suis capable de LookupComboBox sur une cellule de CXGrid
L'ensemble de données J'utilise a un champ à deux caractères, ' Code postal'. Le code supplémentaire suivant dans le FormCreate
ajoutera un LookUpCombo dans sa colonne connectée à un 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;
« ... et donc ... » Je ne vois pas immédiatement pourquoi le fait que vous peuplez la grille d'une jointure multitable devrait se traduire par des « erreurs ». Dans tous les cas, vous ne dites pas quelles sont les erreurs, alors comment les lecteurs pourraient-ils aider si peu à continuer? Je pense que vous devez ajouter à votre q les détails de a) la jointure SQL que vous utilisez pour remplir la grille, b) quels sont les paramètres pour remplir le lookupcombo et c) le texte ** exact ** du message d'erreur (s). – MartynA
@MartynA Ceci est l'une des erreurs "'Impossible de convertir la variante de type (UnicodeString) en type (Boolean)'" Par ailleurs si vous pouviez partager une méthode alternative alors ce serait génial. certains de manière similaire: [link] (http://www.nsonic.de/blog/2007/05/adding-a-combobox-to-a-cell/) Juste une note que je ne suis pas supposé changer le travail actuel c'est-à-dire se référant à rejoindre. – mano
Désolé, vous ne pouvez pas attendre de l'aide si les lecteurs doivent deviner les détails pertinents que vous ne parvenez pas à fournir dans votre q, f.i. le type de données du champ db auquel appartient la zone de liste déroulante. – MartynA