2

私は C# .NET に "数値テキスト ボックス" を持っています。これは Textbox の派生に過ぎず、ユーザーが数値以外を入力できないようにするためのロジックが追加されています。この一環として、タイプdouble?(またはNullable<double>) の Value プロパティを追加しました。ユーザーが何も入力しない場合をサポートするために nullable です。

コントロールは実行時に問題なく動作しますが、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 に答える