2010-05-02 6 views
4

voici mon code:valeur de réglage DataGridViewComboBoxCell manuellement, valeur non valide

 private class Person 
     { 
      private string myName; 
      private int myValue; 

      public Person(string name, int value) 
      { 
       myName = name; 
       myValue = value; 
      } 
      public override string ToString() 
      { 
       return myName; 
      } 

      public string Name 
      { 
       get { return myName; } 
       set { myName = value; } 
      } 

      public int Value 
      { 
       get { return myValue; } 
       set { myValue = value; } 
      } 
     } 

Je l'utilise pour remplir un DataGridViewComboBoxCell comme ceci:

myDataGridViewComboBoxCell.ValueMember = "Value"; 
myDataGridViewComboBoxCell.DisplayMember = "Name"; 
myDataGridViewComboBoxCell.Items.Add(new Person("blabla", someNumber)); 

tout ce que je veux faire maintenant est de choisir un personne:

myDataGridViewComboBoxCell.Value = someNumber; 

mais gardez la valeur "valeur non valide". Une idée pourquoi? Lorsque je sélectionne un élément dans mon programme, je peux voir la bonne valeur (someNumber) et donc Afficher ValueMember sont correctement définis ...

Répondre

9

Plutôt que d'ajouter à DataGridViewComboBoxColumn.Items, vous aurez besoin de mettre DataGridViewComboBoxColumn.DataSource à une liste de personne et définissez DataGridViewComboBoxColumn.ValueType = typeof(Person).

Devrait le faire. Bien que vous ayez posé cette question il y a deux mois, votre problème a peut-être perdu son sens de l'urgence.

+0

Je ne pouvais pas voir la propriété 'ValueType' sur' DataGridView'. Voulez-vous dire 'DataGridViewComboBoxColumn'? – Brij

+1

Oui, c'est sur 'DataGridViewComboBoxColumn'. –

+0

@Simon Dugré, Merci pour le montage. En retard. Fatigué. Tu sais ... – Spike

2

J'ai également eu ce problème. Je l'ai résolu temporairement d'une manière assez sale.

La propriété Value d'un DataGridViewComboBoxCell DOIT être l'une des valeurs contenues dans la propriété Items (ou DataSource lié)

Le problème était que, car je ne sais pas quelle raison, la liste des éléments de la cellule (ou son DataSource lorsque J'ai essayé de ne pas entrer les éléments manuellement) a été effacé dès que l'exécution est entrée dans le gestionnaire d'événements DataGridView.CellFormatting pour cette cellule.

Mon problème consistait à gérer l'événement DataGridView.DataError et à remplir (de nouveau) les éléments DataGridViewComboBoxCell.Items à ce stade.

Private Sub myDataGridView_DataError(ByVal sender As System.Object, _ 
       ByVal e As System.Windows.Forms.DataGridViewDataErrorEventArgs) _ 
       Handles dgvServicesToTransfer.DataError 

     'Dirty Fix 
     If e.ColumnIndex = myComboBoxColumn.Index Then 
      Dim row As DataGridViewRow = dgvServicesToTransfer.Rows(e.RowIndex) 
      ' Fill in your DataGridViewComboBoxCell's Items here: 
      ' ... 
      ' ... 
      If allWentWell Then 
       ' Cancel the exception 
       e.ThrowException = False 
      End If 
     End If 

    End Sub 
End Class 

PS: Désolé pour la réponse VB.Net, si vous avez des problèmes « traduire » il suffit de demander.

+0

Ça m'a aussi bien réussi. J'avais l'affichage et le membre de la valeur ensemble avec valueetype mais avaient encore des problèmes.Découvrir la valeur n'existait pas dans la liste déroulante actuelle m'a aidé à trouver la cause première. – BrandonG

-5

Essayez d'utiliser ENUM pour vos nom des personnes

enum person 
{ 
John, 
Andy, 
Sepehr 
}; 

utilisent ce ENUM pour ajouter le nom vous COMBOBOX

myDataGridViewComboBoxCell.Items.Add (person.andy.tostring(),number); 

maintenant lorsque vous souhaitez définir à nouveau l'utilisation vale ENUM. tyhis va résoudre votre problème.

myDataGridViewComboBoxCell.Value = person.Andy.ToString() ; 

Remembere à utiliser ->ToString()! A travaillé pour moi! :)

+2

Noms enumeres? Cela rend votre système très rigide, ce qui se passe quand une nouvelle personne est jointe, vous devez recompiler le code. – Skuld

+2

L'utilisation d'une énumération pour les noms de personnes peut être le pire conseil que j'ai jamais vu sur StackOverflow. – Rophuine

0

J'ai eu un problème similaire. Aussi étrange que cela puisse paraître, je l'ai résolu en stockant uniquement des chaînes dans DataGridViewComboBoxCell.Items. L'ajout d'objets (avec ToString() bien implémenté, etc.) a causé ces problèmes de "Data Error", mais l'ajout de chaînes a bien fonctionné.

Questions connexes