【发布时间】:2014-03-11 01:22:54
【问题描述】:
我编写了一个 C# Winforms 应用程序。其中一种形式允许通过 PropertyGrid 控件进行配置。我已经为一个属性编写了 TypeConverters,它是一个可以完美运行的对象,但有点细节。
该属性显示一个标准值集合,其元素为 Simbologia 类型。目标属性的类型为 CodigoBarra。
过程如下:当values集合中的第一个元素被选中时,属性赋值为null,不显示对象属性。当在集合中选择不同的值时,CodigoBarra 属性会展开,允许单独更改对象属性。
正如我所说,所有这些过程都有效,但是,当我将集合设置为独占时,就会出现问题。当我按键时,系统无法从 Simbologia 转换为 CodigoBarra。
我尝试过使用 ConvertFrom 方法,甚至向 Simbologia 类添加了隐式转换,但没有帮助。
我使用 Propertygrid 配置的对象称为 Equipo,这是定义:
public class Equipo : IConfiguracion
{
[Category("Impresora"),
DefaultValue(null),
PropertyOrder(16),
TypeConverter(typeof(PropertyGrid.BarCodeConverter)),
DisplayName("Código de Barras"),
Description("Definición del código de barra cuando se imprime el ticket. El código aparecerá a continuación del texto.")]
public CodigoBarra CodigoBarra { get; set; }
public Equipo()
{
this.NombreBiometrico = this.NombreImpresora = String.Empty;
this.PuertoBiometrico = 4370;
this.IpImpresora = "0.0.0.0";
this.PuertoImpresora = 0;
this.AutoCorte = true;
this.ImprimeTicket = true;
}
public Equipo(string ipBiometrico)
: this()
{
this.ID = 0;
this.IpBiometrico = ipBiometrico;
this.Nuevo = true;
}
public Equipo(string nombreBiometrico, string ipBiometrico)
: this()
{
this.ID = 0;
this.NombreBiometrico = nombreBiometrico;
this.IpBiometrico = ipBiometrico;
this.Nuevo = true;
}
public Equipo(int id, string ipBiometrico)
: this()
{
this.ID = id;
this.IpBiometrico = ipBiometrico;
this.Nuevo = id == 0;
}
public Equipo(int id, string nombreBiometrico, string ipBiometrico)
: this()
{
this.ID = id;
this.NombreBiometrico = nombreBiometrico;
this.IpBiometrico = ipBiometrico;
this.Nuevo = id == 0;
}
}
我只留下了 CodigoBarra 财产。
BarCodeConverter如下:
public class BarCodeConverter : TypeConverter
{
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
{
return sourceType == typeof(string) || sourceType == typeof(MonitorView.Configuracion.Simbologia) || base.CanConvertFrom(context, sourceType);
}
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
{
string stringValue = value as string;
object result = null;
if (!string.IsNullOrEmpty(stringValue))
{
var valor = new Configuracion.Simbologia(stringValue);
if (valor.Codigo != InDriver.BarCodeInfo.SymbologyDef.None)
result = new MonitorView.Configuracion.CodigoBarra(valor);
}
return result;
}
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
{
MonitorView.Configuracion.CodigoBarra codigoBarra = value as MonitorView.Configuracion.CodigoBarra;
object result = null;
if (codigoBarra == null)
{
if (value != null)
{
Configuracion.Simbologia simbologia = value as Configuracion.Simbologia;
if (destinationType == typeof(string) && !Configuracion.Simbologia.IsNone(simbologia))
result = simbologia.ToString();
}
}
else
{
if (destinationType == typeof(string) && !Configuracion.Simbologia.IsNone(codigoBarra.Symbology))
result = codigoBarra.ToString();
}
if (String.IsNullOrEmpty((string)result))
result = "[ ninguno ]";
return result ?? base.ConvertTo(context, culture, value, destinationType);
}
public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
{
return true;
}
public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
{
return true;
}
public override TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
{
return new StandardValuesCollection(Configuracion.Simbologia.GetValues());
}
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
{
return true;
}
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
{
return TypeDescriptor.GetProperties(value, attributes);
}
}
正如您在 GetStandardValues 方法中看到的,该集合是使用 Configuracion.Simbologia.GetValues() 调用构建的,该调用返回一个 Simbologia 对象数组。
很明显会产生不匹配,但是为什么只有在按键时才会产生错误?当我使用下拉列表选择 Simbologia 对象时,它可以工作。
最后,这是我在 Simbologia 类中实现的隐式转换:
public static implicit operator CodigoBarra(Simbologia simbologia)
{
return new CodigoBarra(simbologia);
}
我该如何解决?
任何帮助将不胜感激。
谢谢 詹姆
【问题讨论】:
-
“将收藏设置为独占”是什么意思?你有完整的重现代码吗?
-
与.NET的含义相同。看方法:GetStandardValuesExclusive
标签: winforms c#-4.0 type-conversion propertygrid typeconverter