2010-08-10 5 views
0

J'ai un problème avec la liaison de données dans le contrôle DataGridView Win.Forms. Exemple:Liaison de propriétés complexes à DataGridView Win.Forms

public class A 
{ 
     public String Title {get; set; } 
     public B BField { get; set; } 
} 

public class B 
{ 
     public String Name { get; set; } 
} 

Je veux voir ma valeur de la colonne de B. (BField.Name). J'ai essayé d'utiliser la clé suivante pour la clé de données, il suffit de remplir la valeur BField.Name, mais cela ne fonctionne pas pour moi. Sinon, je veux avoir l'opportunité de changer cette valeur de champ via DataGridView.

Aussi j'ai essayé de créer:

class A 
{ 
... 

     public String BField_Name 
     { 
      get{return BField.Name;} 
      set{BField.Name = value;} 
     } 
} 

Mais ça ne marche pas trop. Pouvez-vous m'aider à résoudre ce problème?

Merci!

Avec les meilleures salutations, Alexander.

+0

Pouvez-vous définir "cela ne fonctionne pas trop" pour ce 2ème exemple? Je m'attendrais à ce que ça marche. –

+0

Merci, tout le monde. J'ai trouvé un problème dans mon code. Pour résoudre le problème, je décide d'utiliser par exemple cette ligne "public String BField_Name ...". Mais Converter est une très bonne idée aussi. – oivoodoo

Répondre

1

Pour que la valeur de la classe "B" s'affiche correctement dans la grille, remplacez la méthode ToString pour renvoyer la propriété Title.

Vous pouvez ensuite créer un TypeConvertor pour la classe « B » de sorte que la grille sait comment traduire la valeur de la cellule de chaîne dans un type de classe « B », à savoir

public class BStringConvertor : TypeConverter 
    { 
     public BStringConvertor() 
     : base() 
     { 
     } 

     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 
     // Allow conversion from a String type 
     if (sourceType == typeof(string)) 
      return true; 

     return base.CanConvertFrom(context, sourceType); 
     } 

     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
     { 
     // If the source value is a String, convert it to the "B" class type 
     if (value is string) 
     { 
      B item = new B(); 
      item.Title = value.ToString(); 
      return item; 
     } 
     return base.ConvertFrom(context, culture, value); 
     } 

     public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
     { 
     // If the destination type is a String, convert the "B" class to a string 
     if (destinationType == typeof(string)) 
      return value.ToString(); 

     return base.ConvertTo(context, culture, value, destinationType); 
     } 
    } 

vous pouvez ensuite appliquer le convertisseur la propriété de classe "B" de votre classe "A", c'est-à-dire

public class A 
    { 
     public string Title { get; set; } 

     [TypeConverter(typeof(BStringConvertor))] 
     public B BField { get; set; } 
    } 

    public class B 
    { 
     public string Title { get; set; } 

     public override string ToString() 
     { 
     return this.Title; 
     } 
    } 
Questions connexes