Compact Framework (VS2008, 대상 플랫폼 - Windows Mobile 6.1, C#)에서 표준 ListView 컨트롤의 확장 프로그램을 작성하고 있습니다.Compact Framework에서 사용자 지정 컨트롤의 디자인 타임 오류가 발생했습니다.
클래스는 현재 거의 비어 있으며 하나의 메소드 재정의 (아래 코드 참조) 만 있습니다. 내가 만나는 문제는 이것입니다 : 최소한 ListViewItem이있는 폼에 대한 컨트롤이있을 때 디자인 타임에 열면 컨트롤이 초기화되지 않습니다.
단계 재현 :
- 은 스마트 장치 클래스 라이브러리 프로젝트를 만듭니다.
- 은 새로운 클래스를
ListViewEx : System.Windows.Forms.ListView
오버라이드
OnHandleCreated
방법을 추가protected override void OnHandleCreated(EventArgs e) { base.OnHandleCreated(e); }
- 프로젝트에 파일
DesignTimeAttributes.xmta
을 추가<Classes xmlns="http://schemas.microsoft.com/VisualStudio/2004/03/SmartDevices/XMTA.xsd"> <Class Name="CompleteNamespace.ListViewEx"> <DesktopCompatible>true</DesktopCompatible> <DesignTimeVisible>true</DesignTimeVisible> </Class> </Classes>
(교체 올바른 네임 스페이스와
.)CompleteNamespace
- 프로젝트를 빌드하십시오.
- 동일한 솔루션에서 새 스마트 장치 응용 프로그램 프로젝트를 만듭니다.
- 도구 상자에서
Form1
에있는ListBoxEx
을 드래그하십시오. - 임의의 텍스트와 함께 하나의 열과 하나의 을 추가하십시오.
ListViewEx
에서Details
의 속성을View
으로 설정하십시오.- 저장하고 모든 것을 다시 작성한 다음 양식 디자이너 탭을 닫습니다.
- 양식 디자이너를 다시여십시오.
이 시점에서 나는 그 안에 하나의 항목으로 내 목록보기를 볼 것으로 예상됩니다. 내가 OK
누를 때 나는 (약 1 분) 시간 오픈 양식을두면
The control Microsoft.CompactFramework.Design.HeaderControl has thrown an unhandled exception in the designer and has been disabled.
Exception:
InvalidArgument=Value of '-1' is not valid for 'index'. Parameter name: index
Stack trace:
at Microsoft.CompactFramework.Design.HeaderControl.OnPaint(PaintEventArgs e)
at Microsoft.CompactFramework.Design.HeaderControl.WndProc(Message& m)
에서, ListViewEx 자리가, 또한이
처럼 보이는 VS 또한 새로운 예외 : 대신 VS에서 오류가 발생합니다 오류 :
Code generation for property 'Items' failed. Error was: 'InvalidArgument=Value of '-1' is not valid for 'index'.
Parameter name: index'
일부 노트 :
- 만약이 제거되면 컨트롤이 예상대로 작동합니다.
- 컨트롤이 항목이 없을 때 초기화하지 못합니다.
- 컨트롤이 런타임에 정상적으로 작동합니다.
이제 확실한 해결 방법은 OnHandleCraeted
을 무시하는 것입니다. 하지만 초기화 루틴의 일부로 HWND 핸들이 필요한 일부 네이티브 Windows 메서드를 실행하고 싶습니다.그리고 OnHandleCreated
은 그렇게 할 수있는 적절한 장소 인 것 같습니다. (메서드의 본문에 base.OnHandleCreated
만있는 상태에서 컨트롤이 실패 함)
그래서 질문은 : OnHandleCreated
을 유지하고 디자인 타임에 컨트롤을 작동시키는 방법이 있습니까? 또는 다른 방법 : HWND 핸들이 필요한 네이티브 윈도우 메서드를 실행할 때 언제 어디서 최상의 방법이 있을까요?
분명히 버그와 같은 냄새가 나는데 당신이 한 것처럼 초기화를 옮기는 것이 주변의 유일한 좋은 방법 일 것입니다. – ctacke