2009-07-06 16 views
8

obserwuję na kawałku z this question, jeżeli mam tej klasy:Czy istnieje atrybut, którego można użyć na właściwość, aby poinformować DataGridView, jak sformatować kolumnę?

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

I chcę, aby wyświetlić List<MyClass> w ciągu DataGridView (z wygenerowane automatycznie kolumnach), co jest najprostszym sposobem, aby wyświetlanie kolumny Baz sformatowany jako waluta?

Czy istnieje atrybut, którego mogę użyć tak, jak używam DisplayName, czy też muszę zadzierać z kolumnami po ich utworzeniu?

Odpowiedz

5

Wiem, że nie jest doskonały, ale można dodać inną właściwość o nazwie CurrencyBaz, która zasadniczo zwróci sformatowany Baz, a następnie powiązać go z siatką zamiast z prawdziwym Baz.

coś takiego.

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

To będzie pracować dla mnie (stałe nim choć trochę;). Przyjmuję, jeśli nikt nie wymyśli czegoś lepszego. – Blorgbeard

+0

Chociaż to nie będzie poprawnie wyrównać kolumny, oczywiście .. Wystarczająco dobre dla tego, co robię :) – Blorgbeard

+0

Potrafię wymyślić wszystko, aby naprawić wyrównanie, –

5

TypeConverterAttribute - coś jak:

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

To całkiem fajne, będę musiał pamiętać że. Na razie jednak klasa, którą tworzę, jest tylko prywatną klasą wewnętrzną, która jest wyświetlana na liście - więc prawdopodobnie lepiej będzie użyć mniej kodu i zająć się dodatkową właściwością a la Kay.one. – Blorgbeard

+0

Również, ładny przykładowy kod! Właśnie wkleiłem całą rzecz do SnippetCompiler i uruchomiono. – Blorgbeard

+0

Oczywiście, odłóż 'CurrencyConverter' gdzieś w twojej standardowej bibliotece gdzieś i to ** to ** jedna linia ;-p –

Powiązane problemy