ArgumentException lors de l'ajout de zone de liste déroulante de la colonne de DataGridView avec la même source de données
J'ai un DataGridView
avec des colonnes personnalisées.
Mais quand j'ajoute un "DataGridViewComboBoxColumn
" et de lui donner une liste de mon modèle de classe comme DataSource
ensuite, j'ai eu l'erreur suivante:
Système.ArgumentException:
DataGridViewComboBoxCell valeur n'est pas
valide.
Nouvelle EDIT: 4/9/2009 "Plus de Détails"
J'ai une classe appelée SmsPart
a ces propriétés:
public class SmsPart
{
public int ID
public SmsPart Parent
public string Name
//and more
}
J'ai de la méthode appelée "GetSmsParts
" retour "List<SmsPart>
".
Je veux le Parent
colonne dans le DataGridView à ComboBoxColumn de sélectionner la partie est le parent de la partie sélectionnée.
La raison pour laquelle j'ai fait "DataGridViewComboBoxColumn" et de l'ensemble de source de données de la même source de données pour le trou DataGridView "Qui est le GetsmsParts méthode":
DataGridViewComboBoxColumn comboCulomn = new DataGridViewComboBoxColumn();
comboCulomn.DataSource = listParts;
comboCulomn.DataPropertyName = "Parent";
comboCulomn.DisplayMember = "Name";
comboCulomn.ValueMember = "ID";
comboCulomn.Name = "Parent";
dgvParts.Columns.Add(comboCulomn);
Mais j'ai toujours ce message d'erreur:
Système.ArgumentException:
DataGridViewComboBoxCell valeur n'est pas
valide.
Vous devez vous connecter pour publier un commentaire.
essayez d'assigner le nom du champ de données pour le
ValueMember
propriété declm2
. Pendant que vous êtes en précisant que le type de valeur esttypeof(smsType)
, vous n'êtes pas raconter la zone de liste déroulante de la colonne de la rubrique à utiliser pour la valeur.MODIFIER
Attendez une seconde: Est-ce votre
smsType
certains type complexe ou quelque chose? Je ne suis pas sûr si des restrictions s'appliquent ici, mais pour un exemple, vous devriez utiliser quelque chose commeint
oustring
ou alors (ce que vous auriez normalement s'attendre à être stockées dans un champ de base de données).Aussi, bien sûr, le type de la
DataGridView
's sous-jacente de la source de données de la colonne (dans votre exemple appelé "Type") doit également être du même type que laValueMember
!EDIT 2
Sur votre deuxième commentaire: Imaginez une table de base de données appelé "tbl" qui contient (entre autres) une colonne appelée "Type" qui est de type
Integer
. Vous affichez le contenu de la table dans votre DataGridView et vous voulez que l'utilisateur puisse sélectionner des valeurs pour la colonne "Type" à partir d'une liste déroulante. C'est sur le scénario que vous êtes en train de parler.Value
champ dans unDataGridViewComboBoxColumn
.DataGridViewComboBoxColumn
, vous devez affecter une liste de valeurs possibles de la colonne et de dire à la colonne du champ dans le DataGridView de la source de données qu'il stocke la valeur sélectionnée, le champ est utilisé comme valeur d'affichage et le champ est utilisée comme la valeur qui est stockée dans le sous-jacentes de la source de données de la colonne.Cela signifie que dans l'exemple (en supposant que la source de données pour la colonne contient des propriétés de "Valeur" et "Nom"):
C'est tout. Cependant, le type de propriété que vous attribuez à "ValueMember" ne peut pas être un type complexe (class/struct) si je me souviens bien...
DataGridViewComboBoxColumn limites de saisie de valeurs dans la source de données. J'ai eu ce même problème. J'ai essayé de définir la valeur du champ à l'extérieur de la DGV. J'ai été liaison de la DGV à un DataTable. Si j'ai mis un DataRow["somefield"] pour une valeur de pas dans la source de données, je voudrais recevoir le message d'erreur que vous recevez.
J'ai finalement créé un descendant de DataGridViewColumn qui prennent en charge une zone de liste déroulante de l'éditeur et de permis pour les valeurs qui ne sont pas dans la source de données.
Je peux poster le code, si vous souhaitez le voir.
EDIT: Voici une liste déroulante de la colonne exemple
Voici un exemple d'usage