Diseñador de Formularios de Windows malestar por un control con una propiedad que admite valores null

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un "cuadro de texto numérico" en C# .NETA que no es más que una derivación de la caja de texto, con algunos añadidos de la lógica para evitar que el usuario introducir ningún dato no numérico.Como parte de esto, he añadido un Valor de propiedad de tipo double? (o Nullable<double>).Se aceptan valores null para apoyar el caso de que el usuario no introduzca nada.

El control funciona bien cuando se ejecuta, pero el diseñador de Windows Forms parece que no gusta tratar mucho con él.Cuando el control es agregar a un formulario, la siguiente línea de código se genera en InitializeComponent():

this.numericTextBox1.Value = 1;

Se acuerdan de 'Valor' es de tipo Nullable<double>.Esto genera la siguiente advertencia cada vez que intento abrir el formulario en el Diseñador:

Object of type 'System.Int32' cannot be converted to type 'System.Nullable`1[System.Double]'.

Como resultado, el formulario no puede ser visto en el Diseñador hasta que me quite manualmente la línea y el proceso de reconstrucción después de la cual se regenera tan pronto como puedo guardar los cambios.Molesto.

Alguna sugerencia?

¿Fue útil?

Solución

O, si usted no desea que el diseñador de la adición de cualquier código en todos los...agregue esto a la Propiedad.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

Otros consejos

Parece que hay un problema en Visual Studio 2008.Usted debe crear CodeDomSerializer a trabajar alrededor de ella:

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);
    }
}

Entonces usted debe aplicar por el uso de la DesignerSerializer atributo en la clase.

Podría ayudar a establecer el Atributo DefaultValue sobre la propiedad a los nuevos valores null(1)?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top