Null 허용 속성이 있는 컨트롤로 인해 Windows Forms 디자이너가 혼란스러워졌습니다.

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

  •  09-06-2019
  •  | 
  •  

문제

C# .NET에는 텍스트 상자에서 파생된 "숫자 텍스트 상자"가 있으며 사용자가 숫자가 아닌 항목을 입력하는 것을 방지하는 몇 가지 논리가 추가되었습니다.그 일환으로 다음 유형의 Value 속성을 추가했습니다. double? (또는 Nullable<double>).사용자가 아무것도 입력하지 않는 경우를 지원하기 위해 null을 허용합니다.

컨트롤은 실행 시 잘 작동하지만 Windows Forms 디자이너는 컨트롤을 별로 좋아하지 않는 것 같습니다.컨트롤이 양식에 추가되면 초기화 구성 요소()에 다음 코드 줄이 생성됩니다.

this.numericTextBox1.Value = 1;

'값'은 유형임을 기억하세요. Nullable<double>.디자이너에서 양식을 다시 열려고 할 때마다 다음 경고가 생성됩니다.

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

결과적으로 해당 줄을 수동으로 제거하고 다시 빌드할 때까지 디자이너에서 양식을 볼 수 없습니다. 그 후에는 변경 사항을 저장하자마자 다시 생성됩니다.짜증 나는.

어떤 제안이 있으십니까?

도움이 되었습니까?

해결책

또는 디자이너가 코드를 전혀 추가하지 않기를 원하는 경우...이것을 속성에 추가하십시오.

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

다른 팁

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 수업에 속성을 부여하세요.

설정하는 데 도움이 될까요? DefaultValue 속성 해당 속성을 새로운 Nullable(1)로 변경하시겠습니까?

[DefaultValue(new Nullable<double>(1))]  
public double? Value ...
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top