2008-09-11 8 views
2

C#.NETには、Textboxの派生物ではないものがあります。その一環として、タイプdouble?(またはNullable<double>)のValueプロパティを追加しました。ユーザーが何も入力しない場合はサポートできません。null可能なプロパティを持つコントロールによるWindowsフォームデザイナの設定

実行時にコントロールが正常に機能しますが、Windowsフォームデザイナーはそれをあまり扱っていないようです。コントロールは、フォームに追加されたときに、次のコード行はのInitializeComponent()で生成される:

this.numericTextBox1.Value = 1; 

が「値」タイプNullable<double>であるを覚え。私はデザイナーでフォームを再度開くしようとしたときにこれは次の警告を生成します。

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

私は手動でその行を削除し、再構築されるまでその結果、フォームは、Designerに表示することができません - それは、すぐに再生していますその後私は変更を保存するので。煩わしい。

提案がありますか?

+0

[Ralchの回答](http://stackoverflow.com/questions/56521/windows-forms-designer-up-a-nullable-property/12729701#12729701)が最適な解決策です技術的な見地から、そして人々が最もよく探しているものから。 – jnm2

答えて

3

デザイナーにコードを追加したくない場合は、プロパティにこれを追加してください。

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属性を使用して、それを適用する必要があります

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
-1

そのプロパティのDefaultValue attributeを新しいNullable(1)に設定すると役に立ちますか?

[DefaultValue(new Nullable<double>(1))] 
public double? Value ... 
+0

デザイナーでValueが変更されていない場合は、 – jnm2

2

あなたがそれを回避するために、カスタムCodeDomSerializerを作成する必要がありますVisual Studioの2008年に問題があるようです。

関連する問題