Windows Forms-Designer aufgeregt, wenn eine Steuerung mit einem nullable-Eigenschaft

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

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe eine "numerische textbox" in C# .NET, das ist nichts anderes als eine Ableitung von Textbox, mit einigen zusätzlichen Logik, um zu verhindern, dass die Benutzer die Eingabe etwas nicht numerisch ist.Als Teil dieses, ich habe eine Value-Eigenschaft ist vom Typ double? (oder Nullable<double>).Es ist nullable zur Unterstützung der Fall, in denen nicht der Benutzer irgendetwas eingeben.

Die Steuerung funktioniert gut, wenn Sie ausgeführt wird, aber der Windows Forms-designer nicht scheinen, wie den Umgang mit ihm sehr viel.Wenn das Steuerelement einem Formular Hinzugefügt, der folgende code-Zeile erzeugt, in InitializeComponent():

this.numericTextBox1.Value = 1;

Denken Sie daran 'Wert' ist vom Typ Nullable<double>.Dies erzeugt die folgende Warnung, wenn ich versuche, öffnen Sie das Formular im Designer:

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

Als ein Ergebnis, wird das Formular nicht angezeigt werden, in dem Designer, bis ich manuell entfernen, die Leitung und den Wiederaufbau nach dem hat es regeneriert, sobald ich speichern Sie alle änderungen.Ärgerlich.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Oder, wenn Sie einen Code hinzufügen nicht die Designer wollen überhaupt ... fügen Sie diese zum Immobilien.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

Andere Tipps

Es scheint, dass es ein Problem in Visual Studio 2008. Sie sollten benutzerdefinierte CodeDomSerializer erstellen um ihn zu arbeiten:

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

Dann sollten Sie es anwenden, indem Sie die DesignerSerializer auf Ihrer Klasse zuzuordnen.

Könnte es helfen, die Defaultattribut auf diesem Grundstück zu neuer Nullable (1)?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top