1

Compact Framework (VS2008, 대상 플랫폼 - Windows Mobile 6.1, C#)에서 표준 ListView 컨트롤의 확장 프로그램을 작성하고 있습니다.Compact Framework에서 사용자 지정 컨트롤의 디자인 타임 오류가 발생했습니다.

클래스는 현재 거의 비어 있으며 하나의 메소드 재정의 (아래 코드 참조) 만 있습니다. 내가 만나는 문제는 이것입니다 : 최소한 ListViewItem이있는 폼에 대한 컨트롤이있을 때 디자인 타임에 열면 컨트롤이 초기화되지 않습니다.

단계 재현 :

  1. 은 스마트 장치 클래스 라이브러리 프로젝트를 만듭니다.
  2. 은 새로운 클래스를 ListViewEx : System.Windows.Forms.ListView
  3. 오버라이드 OnHandleCreated 방법을 추가

    protected override void OnHandleCreated(EventArgs e) 
    { 
        base.OnHandleCreated(e); 
    } 
    
  4. 프로젝트에 파일 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

    .)

  5. 프로젝트를 빌드하십시오.
  6. 동일한 솔루션에서 새 스마트 장치 응용 프로그램 프로젝트를 만듭니다.
  7. 도구 상자에서 Form1에있는 ListBoxEx을 드래그하십시오.
  8. 임의의 텍스트와 함께 하나의 열과 하나의 을 추가하십시오.
  9. ListViewEx에서 Details의 속성을 View으로 설정하십시오.
  10. 저장하고 모든 것을 다시 작성한 다음 양식 디자이너 탭을 닫습니다.
  11. 양식 디자이너를 다시여십시오.

이 시점에서 나는 그 안에 하나의 항목으로 내 목록보기를 볼 것으로 예상됩니다. 내가 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 자리가, 또한이 the error text which is displayed in place of the normal control content

처럼 보이는 VS 또한 새로운 예외 : 대신 VS에서 오류가 발생합니다 오류 :

Code generation for property 'Items' failed. Error was: 'InvalidArgument=Value of '-1' is not valid for 'index'.

Parameter name: index'

일부 노트 :

  1. 만약이 제거되면 컨트롤이 예상대로 작동합니다.
  2. 컨트롤이 항목이 없을 때 초기화하지 못합니다.
  3. 컨트롤이 런타임에 정상적으로 작동합니다.

이제 확실한 해결 방법은 OnHandleCraeted을 무시하는 것입니다. 하지만 초기화 루틴의 일부로 HWND 핸들이 필요한 일부 네이티브 Windows 메서드를 실행하고 싶습니다.그리고 OnHandleCreated은 그렇게 할 수있는 적절한 장소 인 것 같습니다. (메서드의 본문에 base.OnHandleCreated 만있는 상태에서 컨트롤이 실패 함)

그래서 질문은 : OnHandleCreated을 유지하고 디자인 타임에 컨트롤을 작동시키는 방법이 있습니까? 또는 다른 방법 : HWND 핸들이 필요한 네이티브 윈도우 메서드를 실행할 때 언제 어디서 최상의 방법이 있을까요?

+0

분명히 버그와 같은 냄새가 나는데 당신이 한 것처럼 초기화를 옮기는 것이 주변의 유일한 좋은 방법 일 것입니다. – ctacke

답변

2

음, 나는 그럭저럭 일을 할 수있었습니다. 내 초기화를 OnParentChanged에 넣었습니다. 나는 그것이 한 번 이상 불릴지도 모른다라는 것을 알고있다. 그리고 나는 그것을 다루었 다.

냄새는 더러운 해킹과 비슷합니다.