Domanda

Ho una "casella di testo numerica" ​​in C# .NET che non è altro che una derivazione di Textbox, con qualche logica aggiunta per impedire all'utente di inserire qualcosa di non numerico.Come parte di ciò, ho aggiunto una proprietà Value di tipo double? (O Nullable<double>).È nullable per supportare il caso in cui l'utente non inserisce nulla.

Il controllo funziona bene quando viene eseguito, ma il progettista di Windows Forms non sembra gradire occuparsene molto.Quando il controllo viene aggiunto a un modulo, la seguente riga di codice viene generata in InitializeComponent():

this.numericTextBox1.Value = 1;

Ricorda che "Valore" è di tipo Nullable<double>.Ciò genera il seguente avviso ogni volta che provo a riaprire il modulo nel Designer:

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

Di conseguenza, il modulo non può essere visualizzato nel Designer finché non rimuovo manualmente la riga e la ricostruisco, dopodiché viene rigenerato non appena salvo le modifiche.Fastidioso.

Eventuali suggerimenti?

È stato utile?

Soluzione

Oppure, se non vuoi che il designer aggiunga alcun codice...aggiungilo alla proprietà.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

Altri suggerimenti

Sembra che ci sia un problema in Visual Studio 2008.Dovresti creare CodeDomSerializer personalizzato per aggirare il problema:

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

Quindi dovresti applicarlo utilizzando il file DesignerSerializer attributo sulla tua classe.

Potrebbe aiutare a impostare il file Attributo DefaultValue su quella proprietà a new Nullable(1)?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top