2009-06-23 8 views
1

J'ai une DGV liée à une liste d'objets. Cela fonctionne bien sauf que l'une des propriétés de l'objet est booléenne et donc affiche comme une case à cocher mais je préférerais un simple champ de texte oui/non à la place. J'ai envisagé d'ajouter une colonne supplémentaire et de remplir la chaîne appropriée en fonction de la valeur booléenne, mais cela semble un peu exagéré. Y a-t-il un moyen plus facile?Une DataGridView liée peut-elle utiliser une cellule de texte pour les valeurs booléennes?

La DGV est en lecture seule.

Répondre

0

Modifiez la colonne qui affiche le booléen afin que la propriété ColumnType = DataGridViewTextBoxColumn.

La colonne affichera maintenant les chaînes True/False.

Faire ce changement dans le concepteur:

  1. Dans le concepteur, cliquez droit sur le DGV.

  2. Dans le menu contextuel, sélectionnez 'Modifier les colonnes ...' La boîte de dialogue Modifier les colonnes s'affiche.

  3. Dans la boîte de dialogue Modifier les colonnes, sélectionnez votre colonne sur la gauche et recherchez les propriétés (y compris ColumnType) sur la droite.

Vous pouvez définir le programme ColumnType lorsqu'une colonne est ajoutée à votre DGV:

DataGridViewColumn column = new DataGridViewColumn(); 
DataGridViewCell cell = new DataGridViewTextBoxCell(); 
column.CellTemplate = cell; 
dgv.Columns.Add(column); 

code de MSDN.

+0

Je ne vois pas de propriété 'ColumnType': Me.DGV.Columns ("ColName").? – Simon

+0

J'ai clarifié un peu comment faire ça! –

+0

Bonne idée, mais je dois le faire par programmation car le DGV est construit dynamiquement au moment de l'exécution. – Simon

3

Il semble que ce n'est pas possible, donc j'ai triché. J'ai ajouté une propriété en lecture seule à mon objet métier qui renvoie une chaîne basée sur la propriété boolean. J'ai juste caché la colonne booléenne dans le DGV et ai montré la propriété de chaîne.

+0

True, mais vous pouvez définir le ColumnType lorsque vous créez la colonne avant de l'ajouter votre DataGridView. –

5

Comme mentionné ci-dessus, il semble impossible de modifier l'apparence visuelle des valeurs booléennes dans un scénario lié aux données. Même DataGridViewCellStyle.FormatProvider ne fonctionne pas correctement avec des types comme System.Int32, System.Int64, System.Decima, etc.

par conséquent, je trouve une solution qui fonctionne pour moi. Probablement ce n'est pas la meilleure solution mais actuellement cela correspond à mes besoins. -je manipuler le événement DataGridView.ColumnAdded et remplacer DataGridViewCheckBoxColumn avec DataGridViewTextBoxColumn. Ensuite, j'utilise l'événement CellFormating (recommandé par Microsoft, voir les liens ci-dessus) pour formater les données source.

private DataGridViewTextBoxColumn textBoxColumn = null; 
void _dataGrid_ColumnAdded(object sender, DataGridViewColumnEventArgs e) 
{ 
    // Avoid recursion 
    if (e.Column == textBoxColumn) return; 

    DataGridView gridView = sender as DataGridView; 
    if (gridView == null) return; 

    if(e.Column is DataGridViewCheckBoxColumn) 
    { 
     textBoxColumn = new DataGridViewTextBoxColumn(); 
     textBoxColumn.Name = e.Column.Name; 
     textBoxColumn.HeaderText = e.Column.HeaderText; 
     textBoxColumn.DataPropertyName = e.Column.DataPropertyName; 

     gridView.Columns.Insert(e.Column.Index, textBoxColumn); 
     gridView.Columns.Remove(e.Column); 
    } 
} 

void _dataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    DataGridViewColumn col = _dataGrid.Columns[e.ColumnIndex]; 

    try 
    { 
     if (col.Name == "IsMale") 
     { 
      bool isMale = Convert.ToBoolean(e.Value); 
      e.Value = isMale ? "male" : "female"; 
     } 
    } 
    catch (Exception ex) 
    { 
     e.Value = "Unknown"; 
    } 
} 
Questions connexes