Windows Forms Designer perturbado por um controle com uma propriedade anulável

StackOverflow https://stackoverflow.com/questions/56521

  •  09-06-2019
  •  | 
  •  

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?

Foi útil?

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 ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top