将复杂属性绑定到DataGridView Win.Forms

时间:2010-08-10 14:12:08

标签: c# .net winforms

我在Win.Forms DataGridView控件中遇到数据绑定问题。 例如:

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

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

我希望在B.(BField.Name)的列值中看到。 我尝试使用下一种方式获取数据密钥,只填充BField.Name值,但它对我不起作用。否则,我希望有机会通过DataGridView查找此字段值。

我也尝试创建:

class A 
{
...

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

但它也不起作用。 你能帮我解决这个问题吗?

谢谢!

最诚挚的问候, 亚历山大。

1 个答案:

答案 0 :(得分:1)

要在Grid中正确显示“B”类值,请覆盖 ToString 方法以返回Title属性。

然后,您可以为“B”类创建一个TypeConvertor,以便Grid知道如何将字符串单元格值转换为“B”类类型,即

   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);
      }
   }

然后,您可以将转换器应用于“A”类的“B”类属性,即

   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;
      }
   }