开发者

Binding complex properties to DataGridView Win.Forms

I have problem with databinding in the Win.Forms DataGridView control. Example:

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

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

I want to see in my column value from B. (BField.Name). I tried to use the next way for data key, just fill with BField.Name value, but it doesn't work for me. Else I want to have opportunity for chaning this field value via DataGridView.

Also I tried to create:

class A 
{
...

       public String BField_Name 
       {
           get{return BField.Name;} 
       开发者_StackOverflow    set{BField.Name = value;}
       }
}

But it doesn't work too. Can you help me to fix this problem?

Thanks!

With The Best Regards, Alexander.


To have the "B" class value show correctly in the Grid, override the ToString method to return the Title property.

You can then create a TypeConvertor for the "B" class so the Grid knows how to translate the string cell value into a "B" class type, i.e.

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

Then you can apply the converter to the "B" class property of your "A" class, i.e.

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜