Winform DataGridViewComboBoxColumn Items ValueMember NULL

TotoLePaBo Messages postés 11 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 22 août 2010 - 22 août 2010 à 11:29
TotoLePaBo Messages postés 11 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 22 août 2010 - 22 août 2010 à 12:30
Bonjour,

Je suis désolé de poser un énième post sur le sujet, mais... je n'ai toujours pas trouvé la solution à mon problème.
Alors, tout est dans le titre normalement ;)

Pour situer le contexte, la base de données (MySql) contient une table utilisateurs avec foreign key sur une table profils.
Il y a des id_profil NULL en base pour certains utilisateurs.

Une instance statique ProfilCollection qui contient tous les Profils de la table plus un profil par défaut qui a un Id NULL, et un libellé 'Par Défaut' - Id est typé en Int32?

J'utilise le composant DataGridView sur le framework 4, avec une colonne DataGridViewComboBoxColumn.

Ma colonne est bindée avec la collection de Profils par la propriété Items, les propriétés ValueMember, DisplayMember, etc...
sont 'a priori' bien settées (mais il doit y avoir une erreur, forcément ;) )

Les valeurs nulles de la colonne 'id_profil' en base provoque une erreur au chargement du grid, interceptée par DataError
: 'La valeur mise en forme de la cellule est d'un type incorrect.' mdr... la cell contient pourtant bien la valeur DBNull.Value

A noter que j'ai tenté pleins de valeurs possibles pour les propriétés
DefaultCellStyle.NullValue et DefaultCellStyle.DataSourceNullValue de la colonne mais rien n'y fait.

Les autres cellules sont correctement remplies.

Voici un bout de code de création de la colonne en question, col et colonne sont des objets qui me permettent de créer des colonnes dynamiquement (je n'ai pas trouvé la balise pour formater le code, désolé) :

//...
DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
//Evenement me renvoyant pour ce cas l'instance statique ProfilCollection
IBindableCollection liste = this.SendBindingCollectionNeeded();
//ValueMember = "Id"
column.ValueMember = liste.ValueMember;
//DisplayMember = "Libelle"
column.DisplayMember = liste.DisplayMember;
column.Items.AddRange(liste.ToArray());
//C'est mon singleton profil par défaut
column.DefaultCellStyle.NullValue = Profil.Default;
column.DefaultCellStyle.DataSourceNullValue = DBNull.Value;
//Methode me ramenant un type nullable a partir d'un type non nullable
//Ca me retourne pour notre cas un Int32?
column.CellTemplate.ValueType = this.GetNullable(col.DataType);
column.ValueType = this.GetNullable(col.DataType);
//DataPropertyName = "id_profil"
column.DataPropertyName = _colonne.Champ;
//....

2 réponses

TotoLePaBo Messages postés 11 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 22 août 2010
22 août 2010 à 11:30
Oups, Merci! ;)
0
TotoLePaBo Messages postés 11 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 22 août 2010
22 août 2010 à 12:30
Bon, je me fais mon propre question-réponse
Trouvé une solution pas très propre mais qui a l'avantage de fonctionner :

Dans l'objet Profil :

/// <summary>
/// Formatte l'id pour l'utilisation dans un DataGridViewComboBoxColumn
/// </summary>
public object DbId {
get {
if (_id.HasValue) {
return _id;
}
return DBNull.Value;
}
set {
if (value == DBNull.Value) {
_id = null;
}
_id = Convert.ToInt32(value);
}
}

Dans ProfilCollection :

/// <summary>
/// Valeur faisant le binding a la base de données
/// </summary>
public string ValueMember {
get {
return "DbId";
}
}

Finalement dans le code précédent :

column.CellTemplate.ValueType = typeof(object);
column.ValueType = typeof(object);


L'inconvénient est que l'on perd le typage sur le contenu des colonnes (Int32? --> object)
Je suis pourtant certain que le composant DataGridViewComboBoxColumn dans le framework 4 (ou antérieur) a une solution toute faite pour ce genre de problème....

Quelqu'un a-t-il déjà contourné ce problème de manière moins 'bidouille' ?

Merci!
0
Rejoignez-nous