2009-07-06 14 views
8

Después de un poco de this question, si tengo esta clase:¿Existe un atributo que pueda usar en una propiedad para decirle a DataGridView cómo formatear la columna?

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

Y quiero mostrar un List<MyClass> en un DataGridView (con columnas generadas automáticamente), ¿cuál es la forma más fácil de hacer que la visualización de las columnas Baz con formato ¿moneda?

¿Hay un atributo que pueda usar como si estuviera usando DisplayName, o tengo que meterme con las columnas después de que se crean?

Respuesta

5

Sé que no es perfecto, pero podría agregar otra propiedad llamada CurrencyBaz que básicamente devolvería un Baz formateado, luego unirlo a la cuadrícula en lugar de la Baz real.

algo así.

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

que funcione para mí (lo arregló un poco aunque;). Lo aceptaré si a nadie se le ocurre algo mejor. – Blorgbeard

+0

Aunque no se alineará a la derecha de la columna, por supuesto .. Lo suficientemente bueno para lo que estoy haciendo :) – Blorgbeard

+0

Puedo pensar en algo para obtener la alineación fija, –

5

TypeConverterAttribute - algo así como:

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

Eso es genial, tendré que recordar ese. Pero por ahora, la clase que estoy creando es solo una clase interna privada para mostrar en una lista de todos modos, así que probablemente sea mejor usar menos código y tratar con una propiedad extra a la manera de la respuesta de Kay.one. – Blorgbeard

+0

¡Además, buen código de ejemplo! Acabo de pegar todo en SnippetCompiler y se ejecutó. – Blorgbeard

+0

Por supuesto, inserte 'CurrencyConverter' en su biblioteca estándar en alguna parte y ** es ** una línea ;-p –

Cuestiones relacionadas