2009-03-11 7 views
2

J'ai un gridview auquel je suis lié par une liste générique. J'ai mis toutes les colonnes moi-même. J'essaie simplement de:DataGridView Binding

Catch format PRE événement erreur lorsqu'une ligne est edited- obtenir les informations de la ligne via un champ caché - et persister

Je suis sûr que cela doit être assez facile mais je ne fait beaucoup avec les formes de travail et je ne suis pas familier avec ses événements DataGridViews.

+0

(voir mise à jour par exemple) –

Répondre

6

Il y a deux façons de voir cela;

  • gérer l'événement CellParsing et analyser la valeur
  • utiliser une coutume TypeConverter sur la propriété

Je préfère habituellement ce dernier, car il faut cette logique loin de l'interface utilisateur; Je vais voir si je peux faire un exemple ...


Exemple (la plupart de ce code est le code "show it working"); ici, je définis un MyDateTimeConverter, qui formate/analyse les dates comme en arrière "jj MMM aaaa" texte (pour aucune bonne raison), et associe ce convertisseur avec l'une des propriétés. Vous pouvez modifier les valeurs dans la grille et les modifications sont repoussées (modifiez les lignes pour voir la mise à jour de la valeur "réelle"). Il n'apparaît pas immédiatement à cause de certaines nuances autour de la notification de changement; il ne valait pas la peine de rendre l'exemple plus complexe juste pour cela ...

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Globalization; 
using System.Windows.Forms; 

class Person 
{ 
    public string Forename { get; set; } 
    public string Surname { get; set; } 

    [TypeConverter(typeof(MyDateTimeConverter))] 
    public DateTime EditableValue { get { return ActualValue; } set { ActualValue = value; } } 
    // this just proves what we have set... 
    public DateTime ActualValue { get; private set; } 
} 
class MyDateTimeConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); 
    } 
    public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 
    { 
     return destinationType == typeof(string) || base.CanConvertTo(context, destinationType); 
    } 
    const string FORMAT = "dd MMM yyyy"; 
    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
    { 
     if (value != null && value is string) 
     { 
      string s = (string)value; 
      return DateTime.ParseExact(Reverse(s), FORMAT, CultureInfo.InvariantCulture); 
     } 
     return base.ConvertFrom(context, culture, value); 
    } 
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 
    { 
     if (destinationType == typeof(string)) 
     { 
      return Reverse(((DateTime)value).ToString(FORMAT, CultureInfo.InvariantCulture)); 
     } 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 
    static string Reverse(string value) 
    { 
     char[] data = value.ToCharArray(); 
     Array.Reverse(data); 
     return new string(data); 
    } 
} 
class MyForm : Form 
{ 
    public MyForm() 
    { 
     DataGridView grid = new DataGridView(); 
     grid.Dock = DockStyle.Fill; 
     List<Person> people = new List<Person>(); 
     people.Add(new Person { Forename = "Fred", Surname = "Flintstone", EditableValue = DateTime.Today }); 
     people.Add(new Person { Forename = "Barney", Surname = "Rubble", EditableValue = DateTime.Today.AddDays(-25) }); 
     grid.DataSource = people; 
     Controls.Add(grid); 
    } 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new MyForm()); 
    } 
}