2009-07-06 7 views
8

Après un peu de this question, si j'ai cette classe:Existe-t-il un attribut que je peux utiliser sur une propriété pour indiquer à DataGridView comment formater la colonne?

private class MyClass { 
    [DisplayName("Foo/Bar")] 
    public string FooBar { get; private set; } 
    public decimal Baz { get; private set; } 
} 

Et je veux afficher un List<MyClass> dans un DataGridView (avec des colonnes générées automatiquement), ce qui est la meilleure façon de rendre l'affichage de la colonne Baz formatée comme devise?

Y at-il un attribut que je peux utiliser comme si j'utilisais DisplayName, ou dois-je jouer avec les colonnes après leur création?

Répondre

5

Je sais que ce n'est pas parfait mais vous pourriez ajouter une autre propriété appelée CurrencyBaz qui retournerait fondamentalement un Baz formaté, puis lierait cela à la grille au lieu du vrai Baz.

donc quelque chose comme ça.

private class MyClass { 
    [DisplayName("Foo/Bar")] 
    public string FooBar { get; private set; } 
    [Browsable(False)] 
    public decimal Baz { get; private set; } 
    [DisplayName("Baz")] 
    public CurrencyBaz 
    { 
     get { return string.Format(Baz, "C2"); } 
    } 
} 
+0

qui fonctionnera pour moi (fixe un peu bien;). Je vais accepter si personne ne trouve quelque chose de mieux. – Blorgbeard

+0

Bien que ça ne va pas aligner correctement la colonne, bien sûr .. Assez bon pour ce que je fais cependant :) – Blorgbeard

+0

Je peux penser à n'importe quoi pour obtenir l'alignement, –

5

TypeConverterAttribute - quelque chose comme:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Globalization; 
using System.Windows.Forms; 
static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new Form { Controls = { 
      new DataGridView { 
       Dock = DockStyle.Fill, 
       DataSource = new List<MyClass> { 
        new MyClass { FooBar = "abc", Baz = 123.45M}, 
        new MyClass { FooBar = "def", Baz = 678.90M} 
       } 
      } 
     }}); 
    } 
} 
class MyClass 
{ 
    [DisplayName("Foo/Bar")] 
    public string FooBar { get; set; } 
    [TypeConverter(typeof(CurrencyConverter))] 
    public decimal Baz { get; set; } 
} 
class CurrencyConverter : DecimalConverter 
{ 
    public override object ConvertFrom(ITypeDescriptorContext context, 
     CultureInfo culture, object value) 
    { 
     string s = value as string; 
     if (s != null) return decimal.Parse(s, NumberStyles.Currency, culture); 
     return base.ConvertFrom(context, culture, value); 
    } 
    public override object ConvertTo(ITypeDescriptorContext context, 
     CultureInfo culture, object value, Type destinationType) 
    { 
     if (destinationType == typeof(string)) 
     { 
      return ((decimal)value).ToString("C2", culture); 
     } 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 
} 
+0

C'est assez cool, je dois me rappeler cette. Mais pour l'instant, la classe que je suis en train de créer n'est qu'une classe interne privée à afficher dans une liste - il est donc préférable d'utiliser moins de code et de gérer une propriété supplémentaire à la Kay.one. – Blorgbeard

+0

Aussi, bon exemple de code! Je viens de coller le tout dans SnippetCompiler et ça a fonctionné. – Blorgbeard

+0

Bien sûr, collez 'CurrencyConverter' loin dans votre bibliothèque standard quelque part et il ** est ** une ligne; –

Questions connexes