2016-08-22 4 views
2

En plus d'obtenir LookupComboBox sur une cellule via la méthode donnée ci-dessous, existe-t-il un autre moyen? -Select a column -From Properties select LookupComboBox -fill out the required data suchas listsource, listfieldnames etcAjout d'un LookupComboBox à une cellule CXGrid

La raison pour la recherche d'une solution alternative est que je reçois des données dans CXGrid en se joignant à plusieurs tables et donc quand j'utiliser la méthode ci-dessus que je rencontrerai des erreurs

je cherche un exemple où i suis capable de LookupComboBox sur une cellule de CXGrid, Help !!

Updated Question

Avec les suggestions ci-dessous j'ai essayé de re-formuler ma question, je pense que cela devrait donner un sens maintenant

J'ai un employé de table et Département

Employee EmpID, EmpName, DepID

Department DepID, DepartmentName

Ainsi, dans le cxGrid Ce que je veux est

EmpID, EmpName, DepartmentName

Ainsi, la requête qui a été donnée à GridDataset pour récupérer les données était

SELECT EmpID, EmpName, DepartmentName FROM Employee INNER JOIN Department ON Department.DepID = Employee.DepID

L'étape suivante est DepartmentName champ CXGrid devrait être éditable via un lookupcombobox Ainsi, -Sélectionnez une colonne (DepartmentName) -Depuis Properties sélectionnez LookupComboBox -fill les données nécessaires suchas ListSource, listfieldnames etc Ici, le est ListSource est un autre ensemble de données qui est au Département avec référait KeyFieldName comme depid

Avec tout ce paramètre lorsque je tente de visualiser les données en cxgrid en faisant GridDataset.open puis je reçois le message d'erreur suivant « Impossible de convertir variante de type (UnicodeString) en type (Boolean) »

+1

« ... 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

+0

@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

+0

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

Répondre

1

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; 

+0

Je vous apprécie vraiment de prendre votre temps précieux. J'ai essayé les deux solutions ci-dessus avant de les publier dans SO. J'essaie mon côté. Merci. – mano

+0

Il a été résolu lorsque j'ai changé le KeyFieldName de DepID à Description. Merci – mano