9
votes

Format Timespan dans la colonne DataGridView

J'ai vu ces Questions Mais tous deux impliquent des méthodes qui ne sont pas disponibles dans la valeur du format Cellstyle. Je veux seulement montrer les heures et les minutes (16:05); Pas les secondes aussi (16:05:13). J'ai essayé de forcer la valeur des secondes à zéro mais j'ai toujours quelque chose comme 16:05:00. À court d'utilisation d'un kludge comme la fourniture d'une chaîne ou d'une date d'heure (et ne montrant que l'heure / la partie) est-ce que je peux obtenir le formatage pour faire ce que je veux.


0 commentaires

6 Réponses :


2
votes

Je ne sais pas comment définir le format de la cellule pour afficher uniquement des heures et des minutes. Je vous suggère de définir le format de la cellule sur la chaîne et de formater la valeur comme celle-ci:

String.Format("{0:D2}:{1:D2}",
    DateTime.Now.TimeOfDay.Hours, DateTime.Now.TimeOfDay.Minutes);


0 commentaires

11
votes

Je viens de découvrir cela moi-même. Malheureusement, la solution est assez impliquée. La bonne nouvelle est que cela fonctionne.

Tout d'abord, vous avez besoin d'un iCustomformatter implémentation qui concerne les valeurs Timespan . Le .NET Framework n'inclut pas un tel type de type de type; Je suis devinant c'est parce que Microsoft ne voulait pas avoir à gérer l'ambiguïté impliquée dans la mise en forme d'un Timespan (par exemple, "HH" signifie "HH" ou uniquement le Composant d'heure?) Et l'affranchissement des problèmes de soutien qui se poserait lorsque ces ambiguïtés ont confondu les développeurs.

Ça va - il suffit de mettre en œuvre le vôtre. Vous trouverez ci-dessous un exemple de classe que j'ai écrit qui utilise fondamentalement Les mêmes chaînes de format personnalisées que DateTime (ceux qui étaient applicables, de toute façon) *: xxx

Nous ne sommes pas encore terminés. Avec ce type en place, vous êtes équipé pour affecter un formateur personnalisé à la colonne de votre DataGridView que vous souhaitez utiliser pour afficher les valeurs Timespan < P> Disons que la colonne s'appelle "temps"; alors vous feriez cela: xxx

alors maintenant vous êtes mis en place, non?

Eh bien, pour une raison quelconque, vous n'êtes toujours pas 100% du chemin là-bas. Pourquoi le formatage personnalisé ne peut pas lancer à ce stade, je ne pouvais honnêtement pas vous dire. Mais nous sommes presque faites. La seule étape consiste à gérer l'événement CellFormatting pour obtenir cette nouvelle fonctionnalité que nous avons écrite pour prendre effet: xxx

enfin, nous 're terminé. Définition du defaultCellstyle.format Propriété du DataGridViewColumn Vous voulez que le formaté en fonction de vos règles personnalisées devrait maintenant fonctionner comme prévu.

* donc, "H" / "HH" pendant des heures, "M" / "MM" pendant des minutes. c.


4 commentaires

Vous pourriez avoir raison de savoir pourquoi ce n'est pas dans le cadre. C'est beaucoup plus impliqué que je pensais que cela aurait été, merci.


Fonctionne parfaitement. Un cœur sentit merci.


Super! Avez-vous une solution pour gérer les modifications utilisateur avec ce formateur personnalisé?


En commençant par .NET 4, vous pouvez utiliser (et devrait) utiliser la solution @ David, voir msdn.microsoft.com/en-us/library/ee372287 (v ​​= vs.100) .aspx .



9
votes

Il est possible d'obtenir l'effet identique en utilisant simplement l'événement CellFormatting.

private void dataGridView_CellFormatting(object sender,
           DataGridViewCellFormattingEventArgs e)
{
      if (e.Value != null && e.Value != DBNull.Value)
            e.Value =  ((TimeSpan)e.Value).Hours.ToString("00") + ":" +
                       ((TimeSpan)e.Value).Minutes.ToString("00");
}


1 commentaires

Commençant par .NET 4 Ceci pourrait être simplifié pour formater directement: si (e.columnindex == iDx && e.value! = Null && e.value! = Dbnull.value) {E.Value = ((Timespan) e.value) .tostring ("DDD \\. HH \\: mm \\: ss"); } , ou même mieux, en ajoutant ce qui suit à l'initialisation de la DataGridView: dgv.columns [IDX] .defaultcellstyle.format = "ddd \\. HH \\: mm \\: ss" ;



5
votes

Essayez le code suivant

dataGridView1.Columns["columnName"].DefaultCellStyle.Format = "hh\\:mm";


0 commentaires

0
votes

Utiliser la chaîne de format "HH \\: mm" . E.g xxx


1 commentaires

Vérifiez toujours votre formatage avant de poster pour vous assurer que le point entier n'était pas perdu à un malentendu de Markdown.



0
votes

Essayez une autre approche. Il suffit d'ajouter à votre classe de liaison aux propriétés DataGridView comme par exemple DatePacketattimedelaySTR code>.

Disons que vous avez une classe qui l'a ... P>

public DateTime? LastPacketAtTime { get; set; }

public TimeSpan? LastPacketAtTimeDelay 
{ 
   get 
   {
         if (LastPacketAtTime.HasValue)
         {
              var ts = DateTime.Now - LastPacketAtTime.Value;
              return ts;
         }
         return null;
    }          
}

public string LastPacketAtTimeDelayAsStr
{
     get
     {
         if (LastPacketAtTimeDelay.HasValue)
         {            
             var hours = LastPacketAtTimeDelay.Value.Hours.ToString("00");
             var minutes = LastPacketAtTimeDelay.Value.Minutes.ToString("00");
             var seconds = LastPacketAtTimeDelay.Value.Seconds.ToString("00");
    
           return $"{LastPacketAtTimeDelay.Value.Days} days {hours}:{minutes}:{seconds}";
          }
          return null;
      }
}


0 commentaires