2

我在 C# .NET 中有一个“数字文本框”,它只不过是文本框的派生,添加了一些逻辑来防止用户输入任何非数字内容。作为其中的一部分,我添加了一个类型为double?(或Nullable<double>)的 Value 属性。支持用户不输入任何内容的情况是可以为空的。

该控件在运行时工作正常,但 Windows 窗体设计器似乎不太喜欢处理它。当控件添加到窗体时,InitializeComponent() 中会生成以下代码行:

this.numericTextBox1.Value = 1;

记住“价值”是类型Nullable<double>。每当我尝试在设计器中重新打开表单时,都会生成以下警告:

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

因此,在我手动删除该行并重建之前,无法在设计器中查看该表单——之后,只要我保存任何更改,它就会重新生成。恼人的。

有什么建议么?

4

3 回答 3

3

或者,如果您根本不希望设计器添加任何代码...将其添加到属性中。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
于 2008-09-11T13:34:28.577 回答
2

Visual Studio 2008 中似乎存在问题。您应该创建自定义 CodeDomSerializer 来解决它:

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

然后你应该通过在你的类上使用DesignerSerializer属性来应用它。

于 2012-10-04T14:35:46.543 回答
-1

将该属性上的DefaultValue 属性设置为 new Nullable(1) 是否有帮助?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
于 2008-09-11T13:32:11.297 回答