2009-07-06 9 views
8

, this question dan biraz üzerinde takiben:DataGridView'e sütunu nasıl biçimlendireceğini anlatmak için bir mülkte kullanabileceğim bir Öznitelik var mı? Bu sınıf varsa

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

Ve ben bir DataGridView (ile otomatik olarak oluşturulan sütunlar) bir List<MyClass> görüntülemek istediğiniz gibi biçimlendirilmiş Baz sütun ekran yapmak için en kolay yolu nedir para birimi?

DisplayName kullanıyorum gibi kullanabileceğim bir özellik var mı, yoksa oluşturulduktan sonra sütunlarla karıştırmam mı gerekiyor?

cevap

5

Kusursuz olmadığını biliyorum, ancak temel olarak bir Biçim Baz'ı döndüren CurrencyBaz adlı başka bir özellik ekleyebilirsin, sonra bunu gerçek Baz yerine ızgaraya bağlayabilirsin.

Böyle bir şey.

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

benim için çalışacak (biraz olsa bunun sabit). Hiç kimse daha iyi bir şeyle gelmezse kabul edeceğim. – Blorgbeard

+0

Tabii ki, sağ sütun hizalamak olmasa da .. Yaptığım şey için yeterince iyi olsa da :) – Blorgbeard

+0

Hizalamayı düzeltmek için bir şey düşünebilirim, –

5

TypeConverterAttribute - gibi bir şey:

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

Çok güzel, hatırlamak zorundayım söyledi. Ama şu an için, yaptığım sınıf, bir listede görüntülenmek için sadece özel bir iç sınıftır - bu yüzden daha az kod kullanmak ve ekstra bir özellik ile bir Kay Kayone'nun cevabı vermek daha iyi olacaktır. – Blorgbeard

+0

Ayrıca, güzel örnek kod! Her şeyi SnippetCompiler'a yapıştırdım ve kaçtı. – Blorgbeard

+0

Tabii ki, 'CurrencyConverter' standart kütüphanenizde bir yere yapışıp, ** bir satır; -p –

İlgili konular