2010-02-03 5 views
0

J'ai utilisé cet exemple pour créer une colonne DateTime pour un DataGridView dans mon application winforms.datagridview applique cellstyle aux cellules

http://msdn.microsoft.com/en-us/library/7tas5c80.aspx

Je peux voir la nouvelle colonne dans le Concepteur Windows Forms et l'ajouter à un DataGridView existant. Cependant, je veux pouvoir changer le format d'affichage quand je change le "DefaultCellStyle" dans le concepteur.

Le concepteur généré code ressemble à ceci:

DataGridViewCellStyle1.Format = "t" 
    DataGridViewCellStyle1.NullValue = Nothing 
    Me.colDate.DefaultCellStyle = DataGridViewCellStyle1 
    Me.colDatum.Name = "colDate" 
    Me.colDatum.Resizable = System.Windows.Forms.DataGridViewTriState.[False] 

Ce qui est bien. Mais puisque le code du DataGridViewCalendarCell fait cela dans le constructeur:

Public Sub New() 
     Me.Style.Format = "d" 
    End Sub 

Le format ne change jamais à "t" (format de l'heure). Je n'ai pas trouvé comment appliquer le format de la colonne à posséder ce que j'utilise woraround atm:

Public Overrides Function GetInheritedStyle _ 
      (ByVal inheritedCellStyle As _ 
        System.Windows.Forms.DataGridViewCellStyle, _ 
      ByVal rowIndex As Integer, ByVal includeColors As Boolean) _ 
    As System.Windows.Forms.DataGridViewCellStyle 

     If Me.OwningColumn IsNot Nothing Then 
      Me.Style.Format = Me.OwningColumn.DefaultCellStyle.Format 
     End If 

     Return MyBase.GetInheritedStyle(_ 
      inheritedCellStyle, rowIndex, includeColors) 

    End Function 

Cependant, comme cela est juste une astuce que je veux savoir qui est le « comment il se doit » être fait moyen d'appliquer le cellstyle par défaut d'un DataGridViewColumn à ses cellules. Aucune suggestion?

Répondre

0

Je supprimer le constructeur. Le problème est que le constructeur est impliqué dans la création d'un style. Par conséquent, le format du style par défaut ne sera pas utilisé. Il s'agit en fait d'une "ressource" parce que chaque cellule va avoir son propre style, au lieu que toutes les cellules partagent le même style. La suppression du constructeur résoudra votre problème, mais si vous voulez par défaut "date courte" alors peut-être l'annulation de GetFormattedValue est la meilleure implémentation. Tels que l'exemple suivant. Je tiens à souligner que c'est un exemple seulement. Vous faites travailler les détails.

Protected Overrides Function GetFormattedValue(_ 
     ByVal value As Object, _ 
     ByVal rowIndex As Integer, _ 
     ByRef cellStyle As System.Windows.Forms.DataGridViewCellStyle, _ 
     ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _ 
     ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, _ 
     ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object 

     If (cellStyle IsNot Nothing) OrElse (String.IsNullOrEmpty(cellStyle.Format)) Then 
      'no format specified, so default to short date 
      cellStyle.Format = "d" 
     End If 

     Return MyBase.GetFormattedValue(value, rowIndex, cellStyle, valueTypeConverter, formattedValueTypeConverter, context) 

    End Function 
Questions connexes