我有一个具有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;
}