2009-12-03 4 views
1

Problème: Mon DataGridView a des cellules hautes à cause de certaines images dans les colonnes précédentes. Ainsi, la colonne ComboBox affiche une propagation ComboBox sur toute la hauteur (et la largeur) de chaque cellule, ce qui semble simplement inacceptable.Dimensionnement et placement de ComboBox C# dans DataGridViewComboBoxColumn

Question: Existe-t-il un moyen de définir la taille et l'emplacement de la zone de liste déroulante afin qu'elle soit centrée dans chaque cellule et conserve sa taille par défaut?

Remarque: De googler autour, il semble que cela pourrait être possible en créant ma propre colonne personnalisée pour accueillir une zone de liste déroulante et passer outre l'événement de peinture, mais avant d'aller dans cette voie, je veux vous assurer que est la seule façon.

Répondre

2

@mlsteeves, merci d'avoir signalé l'événement CellPainting. Je ne sais pas comment j'ai réussi à l'ignorer. Mais voici ce que je vais faire maintenant, semble fournir le résultat que je cherchais:

void DataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex >= 0 && e.ColumnIndex == ComboBoxColumnIndex) 
    { 
     ComboBox comboBox = this.DataGridView.Controls["ColumnComboBox" + e.RowIndex] as ComboBox; 
     if (comboBox == null) 
     { 
      comboBox = this.GetNewComboBox(e.RowIndex); 
      comboBox.Name = "ColumnComboBox" + e.RowIndex; 
      this.DataGridView.Controls.Add(comboBox); 
     } 

     if (comboBox != null) 
     { 
      comboBox.Width = e.CellBounds.Width - 10; 
      comboBox.Left = e.CellBounds.Left + ((e.CellBounds.Width - comboBox.Width)/2); 
      comboBox.Top = e.CellBounds.Top + ((e.CellBounds.Height - comboBox.Height)/2); 
     } 
    } 
} 
1

Je viens de recréer votre problème, et je dois admettre que c'est nul! :)

Une façon de contourner le problème est d'accéder aux propriétés de votre colonne ComboBox et de modifier le Display Style en Nothing. Cela entraînera uniquement l'affichage du texte sélectionné lorsque la cellule n'est pas en cours de modification, la zone de liste déroulante ne s'affichera pas tant que vous n'aurez pas modifié la cellule.

Lorsque votre ligne augmente, vous pouvez modifier le DefaultCellStyle de sorte que Alignment soit défini sur Top Left.

Si vous souhaitez que la zone de liste déroulante s'affiche lorsque la cellule n'est pas en cours d'édition, consultez l'événement CellPainting, il vous permet de personnaliser l'apparence d'une cellule. Cela pourrait vous permettre de dessiner votre ComboBox sur votre cellulaire.

Questions connexes