2008-09-11 6 views
2

C# .NET에 "숫자 텍스트 상자"가 있습니다.이 텍스트 상자는 사용자가 숫자가 아닌 값을 입력하지 못하도록하는 몇 가지 추가 논리가있는 텍스트 상자의 파생 요소입니다. 이 중 일부로서 double? (또는 Nullable<double>) 유형의 Value 속성을 추가했습니다. 사용자가 아무 것도 입력하지 않는 경우 지원할 수 없습니다.nullable 속성이있는 컨트롤에 의해 Windows Forms Designer가 설정됩니다.

컨트롤을 실행할 때 정상적으로 작동하지만 Windows Forms 디자이너는 그다지 처리하지 않는 것 같습니다. 제어는 형태로 첨가하는 경우, 다음의 코드는 InitializeComponent를()로 생성된다

this.numericTextBox1.Value = 1; 

'는 값'형태 Nullable<double>이다 기억. - 그것은 바로 재생있어 그 후에 내가 수동으로 줄을 제거하고 다시 때까지

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

양식이 디자이너에서 볼 수 없습니다 : 나는 디자이너에서 양식을 다시 열 때마다 다음과 같은 경고를 생성 변경 사항을 저장하면됩니다. 성가신.

제안 사항?

+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을 만들어야합니다 비주얼 스튜디오 2008에서 문제가있는 것 같다.