如何在使用bindingsource时自动从color转换为int



我有一个具有int类型颜色属性的实体。在我的表单中,我有一个自定义下拉列表(继承自ComboBox(,其中显示了KnownColor的列表。

此下拉列表显示一个ColorInfo类,它只是一个具有2个属性(名称:字符串,颜色:颜色(的类。此外,我做了以下工作:

public new ColorInfo SelectedItem
{
get { return (ColorInfo)base.SelectedItem; }
set { base.SelectedItem = value; }
}
public new string SelectedText
{
get
{
if (SelectedIndex >= 0)
return SelectedItem.Name;
return String.Empty;
}
set
{
for (int i = 0; i < Items.Count; i++)
{
if (((ColorInfo)Items[i]).Name == value)
{
SelectedIndex = i;
break;
}
}
}
}
public new Color SelectedValue
{
get
{
if (SelectedIndex >= 0)
return SelectedItem.Color;
return Color.White;
}
set
{
for (int i = 0; i < Items.Count; i++)
{
if (((ColorInfo)Items[i]).Color == value)
{
SelectedIndex = i;
break;
}
}
}
}

我在表单上使用BindingSource,通过在控件的DataBindings部分中设置SelectedValue属性,我将此下拉列表绑定到实体的Color属性(为int(。

但是,即使在选择颜色时,该属性也始终设置为0。如何自动从color转换为int并返回?

更新

我创建了这个类:

public class ColorTypeConverter : TypeConverter
{
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(int))
return (Color.FromKnownColor((KnownColor)value).ToArgb());
return base.ConvertTo(context, culture, value, destinationType);
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value is int)
return Color.FromArgb((int)value);
return base.ConvertFrom(context, culture, value);
}
}

如何以及在哪里使用它,以便自动进行转换?

Color类有一些方法可能对您的情况有所帮助,如果你在列表中使用KnownColor枚举器,那么你可以简单地通过调用FromKnownColor方法将其转换为颜色:var color = Color.FromKnownColor(KnownColor.White);你也可以使用FromArgb方法将整数转换为颜色,如下所示:var color = Color.FromArgb(5);如果你想将颜色转换为整数,你可以用ToArgb()方法:var argb = Color.White.ToArgb();

在你的情况下,从列表上的选择返回一种颜色,那么你的get应该做一些类似的事情:

public new Color SelectedValue
{
get
{
//Asuming SelectedIndex is a valid int color value from your list
if (SelectedIndex >= 0)
return Color.FromArgb(SelectedIndex);
return Color.White;
}

最新更新