Windows Forms Designer perturbado por um controle com uma propriedade anulável
Pergunta
Eu tenho uma "caixa de texto numérica" em C# .NET que nada mais é do que uma derivação do Textbox, com alguma lógica adicional para evitar que o usuário insira algo não numérico.Como parte disso, adicionei uma propriedade Value do tipo double?
(ou Nullable<double>
).É anulável para dar suporte ao caso em que o usuário não insere nada.
O controle funciona bem quando executado, mas o designer do Windows Forms não parece gostar muito de lidar com ele.Quando o controle é adicionado a um formulário, a seguinte linha de código é gerada em InitializeComponent():
this.numericTextBox1.Value = 1;
Lembre-se de que 'Valor' é do tipo Nullable<double>
.Isso gera o seguinte aviso sempre que tento reabrir o formulário no Designer:
Object of type 'System.Int32' cannot be converted to type 'System.Nullable`1[System.Double]'.
Como resultado, o formulário não pode ser visualizado no Designer até que eu remova manualmente essa linha e a reconstrua - após o que ela será regenerada assim que eu salvar as alterações.Chato.
Alguma sugestão?
Solução
Ou, se você não quiser que o designer adicione nenhum código...adicione isso à propriedade.
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
Outras dicas
Parece que há um problema no Visual Studio 2008.Você deve criar CodeDomSerializer personalizado para contornar isso:
public class CategoricalDataPointCodeDomSerializer : CodeDomSerializer
{
public override object Deserialize(IDesignerSerializationManager manager, object codeObject)
{
CodeStatementCollection collection = codeObject as CodeStatementCollection;
if (collection != null)
{
foreach (CodeStatement statement in collection)
{
CodeAssignStatement codeAssignment = statement as CodeAssignStatement;
if (codeAssignment != null)
{
CodePropertyReferenceExpression properyRef = codeAssignment.Left as CodePropertyReferenceExpression;
CodePrimitiveExpression primitiveExpression = codeAssignment.Right as CodePrimitiveExpression;
if (properyRef != null && properyRef.PropertyName == "Value" && primitiveExpression != null && primitiveExpression.Value != null)
{
primitiveExpression.Value = Convert.ToDouble(primitiveExpression.Value);
break;
}
}
}
}
return base.Deserialize(manager, codeObject);
}
}
Então você deve aplicá-lo usando o DesignerSerializer atributo em sua classe.
Poderia ajudar a definir o Atributo DefaultValue naquela propriedade para new Nullable(1)?
[DefaultValue(new Nullable<double>(1))]
public double? Value ...