문제

사용자 정의 컨트롤을 작성하려고하는 동안 System.windows.forms.textformatflags Enum의 문제가 발생했습니다. Visual Studio (2005/2008) 편집기. 이 문제의 이유는이 열거가 여러 멤버가 있다는 사실에서 비롯된 것 같습니다. 이 멤버를 선택하면 (GlyphoverHangPadding, Left, Default, Top)가 편집기가 속성을 설정합니다.

this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.GlyphOverhangPadding;

코드는 예상대로 컴파일됩니다. 그러나 편집기 속성 그리드에서 0이 아닌 멤버 (예 : "Right")를 선택하면 다음과 같은 결과가 있습니다.

this.customControl.TextFormatFlags = System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right;

분명히 이것은 컴파일하지 않습니다. 0이 아닌 멤버가 두 명 이상 선택되면 (예 : "오른쪽 | 하단"을 통해) 다음과 같은 결과가 나옵니다.

this.customControl.TextFormatFlags = ((System.Windows.Forms.TextFormatFlags)((System.Windows.Forms.TextFormatFlags.Left, Default, Top, Right | System.Windows.Forms.TextFormatFlags.Left, Default, Top, Bottom)));

보시다시피, 편집자는 선택한 항목에 4 명의 제로 가치 멤버 중 3 개를 추가합니다.

이 문제를 재현하려면 :

  • Visual Studio 2005/2008에서 새 프로젝트 만들기 (Windows Forms Application)
  • 프로젝트에 사용자 정의 컨트롤을 추가하십시오.
  • 새로운 클래스에 개인 분야와 공공 재산을 추가하십시오.

    Private TextFormatflags TFF = TextFormatflags.Default;

    public textformatflags tffproperty {get {return this.tff; } set {this.tff = value; }}

  • 코드를 컴파일하십시오

  • Designer에서 Form1을 열고 CustomControl1을 추가하십시오.
  • 코드는 정상적으로 컴파일됩니다
  • 이제 편집기 속성 그리드에서 CustomControl1의 속성을 엽니 다.
  • "기타"섹션 아래에 tffproperty가 표시됩니다.
  • 이 숙박 시설은 몇 가지 값을 제공하며 대부분 쉼표가 포함되어 있습니다.
  • 쉼표로 값을 선택하면 (예 : "왼쪽, 기본값, 상단, HorizontalCenter)가 편집 할 수없는 코드가 발생합니다.

플래그 속성으로 나만의 열거를 만들고 한 번 이상의 멤버를 0에 추가하는 경우 (이것은 일종의 오르플 링 플래그 열거입니까?) 마찬가지입니다. 나는 이것이 내가 사용하고있는 UityPeeditor의 버그가 아님을 확인했습니다 (UityPeeditor를 사용하지 않고 동일한 문제가 발생합니다). 나는 지금까지 성공하지 않고 컨버터로 문제를 우회하려고 노력했다. 이 문제를 해결하는 방법에 대한 아이디어가 있으면 기꺼이들을 수 있습니다.

도움이 되었습니까?

해결책

나는 다양한 수업을 확인했다 System.ComponentModel.Design.Serialization 리플렉터를 사용하는 네임 스페이스를 사용하면 코드 시리얼 라이저가 약간 장난 꾸러기라고 생각합니다.

열거는 처리됩니다 EnumCodeDomSerializer.Serialize, 그 목적은 열거를 가져다가 그것을 System.CodeDom.CodeExpression 디자이너 파일에서 보는 것을 나타내는 객체.

이 방법이 올바르게 사용됩니다 CodeBinaryOperatorExpression 처리하기 위해 | 표현의 측면. 그러나 개별 열거 값의 경우 사용합니다. Enum.ToString ~을 통해 EnumTypeConverter 결과 문자열을 표현식 트리에 직접 붙입니다.

제 생각에는 Enum.ToString 당신이보고있는 것의 궁극적 인 원인입니다.

다수의 열거 회원이 동일한 기본 값을 갖고 기본 값을 기준으로 열거 회원의 이름 표현을 검색하려고 시도한 경우, 코드가 반환 할 메소드 이름에 대한 가정을하지 않아야합니다.

MSDN 페이지가 켜져 있습니다 Enum.ToString 쉼표에 대해 이야기하지 않지만 여전히 출력에 의존하는 것이 안전하지 않은 것 같습니다. Enum.ToString 유효한 c# 표현식입니다.

이것이 당신의 통제에 어떤 의미가 있는지 잘 모르겠습니다.

  • 분명히 당신은 자신의 교체를 정의 할 수 있습니다 TextFormatFlags 복제 된 제로 플래그없이 수행하십시오
  • 사용자 정의 유형 변환기로 해킹 할 수 있습니다. InstanceDescriptor. 이를 통해 디자이너 생성 코드에 나타나는 내용을 조금 더 제어 할 수 있습니다.
  • 당신은 아마도 노출 될 수 있습니다 int 디자이너 세리어 라이저에게 a TextFormatFlags 속성 그리드에

편집하다: 쉼표로 구분 된 목록 동작 Enum.ToString 실제로 문서화되어 있습니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top