Windows Forms Designer bouleversé par un contrôle avec une propriété nullable

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

  •  09-06-2019
  •  | 
  •  

Question

J'ai une "zone de texte numérique" en C# .NET qui n'est rien de plus qu'une dérivation de Textbox, avec une logique supplémentaire pour empêcher l'utilisateur de saisir quoi que ce soit de non numérique.Dans ce cadre, j'ai ajouté une propriété Value de type double? (ou Nullable<double>).Il est nullable pour prendre en charge le cas où l'utilisateur ne saisit rien.

Le contrôle fonctionne correctement lorsqu'il est exécuté, mais le concepteur Windows Forms ne semble pas beaucoup aimer s'en occuper.Lorsque le contrôle est ajouté à un formulaire, la ligne de code suivante est générée dans InitializeComponent() :

this.numericTextBox1.Value = 1;

N'oubliez pas que « Valeur » est de type Nullable<double>.Cela génère l'avertissement suivant chaque fois que j'essaie de rouvrir le formulaire dans le Designer :

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

Par conséquent, le formulaire ne peut pas être affiché dans le concepteur tant que je n'ai pas supprimé manuellement cette ligne et reconstruit - après quoi il est régénéré dès que j'enregistre les modifications.Ennuyeux.

Aucune suggestion?

Était-ce utile?

La solution

Ou, si vous ne voulez pas que le concepteur ajoute du code du tout...ajoutez ceci à la propriété.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

Autres conseils

Il semble qu'il y ait un problème dans Visual Studio 2008.Vous devez créer un CodeDomSerializer personnalisé pour contourner ce problème :

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

Ensuite, vous devez l'appliquer en utilisant le DesignerSerializer attribut sur votre classe.

Cela pourrait-il aider à définir le Attribut DefaultValue sur cette propriété vers new Nullable(1) ?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top