4

컨트롤 컬렉션을 나타내는 속성을 구성 요소에 추가하고 컬렉션에 속한 컨트롤을 쉽게 선택할 수있는 컬렉션 편집기가 필요합니다. VS는 않습니다 나는 다음과 같은 코드를 자동으로 원하는 거의 :컨트롤 컬렉션에 대한 디자인 타임 편집기 지원

Private _controls As New List(Of Control) 
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ 
    Public ReadOnly Property SelectedControls() As List(Of Control) 
     Get 
      Return _controls 
     End Get 
    End Property 

내가 추가하고 컨트롤을 제거 할 수 있습니다, 기본 CollectionEditor을 얻고, 콜렉션이 직렬화이다.

문제는 내가 추가 새로운 컨트롤을 추가하고 싶지 않아 양식에있는 다른 사용 가능한 컨트롤에서 여러 컨트롤을 선택하고 싶습니다. 이 작업을 수행하는 쉽고 표준적인 방법이 있습니까? 아니면 내 컬렉션 편집기를 작성하고 컨트롤 컬렉션을 실행해야합니까?

컬렉션 편집자 (UITypeEditors) 및 기타 디자인 타임 항목에는 많은 내용이 있지만 정확한 동작을 나타내는 링크를 찾을 수 없어 도움이 되었기 때문입니다.

답변

4

OK, 그래서 나는 점심을 먹었고 편집인을 직접 작성했습니다. 그렇게 대단한 노력은 아니 었습니다. 도움이된다면 나눌 수있어 기쁩니다.

편집 : 솔루션 개요

나는 재귀 적으로 트 리뷰에서 양식에있는 모든 컨트롤을 나열하는 편집기 (스크린 샷 참조) 썼다. 컨트롤에 텍스트 또는 이미지 속성이 설정되어 있으면 텍스트/이미지가 표시됩니다. 사용자는 확인란이있는 여러 컨트롤을 선택하고 목록을 필터링하여 특정 유형의 컨트롤 만 표시 할 수도 있습니다.

(이 편집기는 내부 용으로 만 사용되었으므로 일반적으로 이미지 속성을 확인하는 데 신경 쓰지 않고 잘 알려진 몇 가지 컨트롤 유형을 처리합니다.)

alt text http://i37.tinypic.com/154enpw.png

에디터 형태의 코드, 그냥 UI 정말 사용자가 양식을 닫을 때 선택한 컨트롤의 목록을 트리를 작성 미리 선택된 컨트롤 목록에 검사를 설정하고 반환 할 책임 OK로.

다음으로 FormControlSelectionEditor라는 UITypeEditor를 구현하는 클래스가 있습니다. 이 클래스는 [Editor] 속성을 사용하기 위해 에디터를 사용할 속성에 할당됩니다. 필요한 경우 폼의 새 인스턴스를 만들고 모달 대화 상자로 표시하는 것 이상을 수행하지 않습니다.

그런 다음 System.Collections.ObjectModel.ObservableCollection (Of Control) 유형의 속성이 있습니다. ObservableCollection을 선택한 이유는 런타임에 목록에 대한 변경 사항에 반응해야하기 때 문 이었지만 다른 목록은 사소한 수정 작업에서도 마찬가지였습니다.

내가 발견 한 한 가지 점은 컨트롤 목록을 사용하도록 속성과 편집기를 작성해야한다는 것입니다. 즉, UITypeEditor 코드는 속성에 저장된 목록의 사본을 만들어 양식이 열릴 때 수표를 설정하기 위해 편집기 양식에 전달하고 양식을 닫으면 속성의지지 목록을 지우고 편집기에서 반환 된 목록의 각 컨트롤을 복사합니다. 그렇지 않으면 .designer 파일의 serialization에 문제가있는 것으로 나타났습니다. 나는 그것이 이런 방식이어야한다고 믿지 않는다. 나는 그것이 내 편이 더 오류라고 생각한다.일반적인 속성에 대한

코드 : 나는 zip 파일로 편집기를 넣었습니다

Private WithEvents _insertButtons As New System.Collections.ObjectModel.ObservableCollection(Of Control) 
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ 
    <Editor(GetType(Design.FormControlSelectionEditor), GetType(UITypeEditor))> _ 
    Public Property InsertButtons() As System.Collections.ObjectModel.ObservableCollection(Of Control) 
     Get 
      Return _insertButtons 
     End Get 
     Set(ByVal value As System.Collections.ObjectModel.ObservableCollection(Of Control)) 
      If value Is Nothing Then 
       RemoveInsertButtonEventHandlers(_insertButtons) 
       _insertButtons.Clear() 
      Else 
       ' Copy the list items passed in into the internal list 
       For i As Integer = _insertButtons.Count - 1 To 0 Step -1 
        If Not value.Contains(_insertButtons.Item(i)) Then _insertButtons.RemoveAt(i) 
       Next 
       For Each ctl As Control In value 
        If Not _insertButtons.Contains(ctl) Then _insertButtons.Add(ctl) 
       Next 
      End If 
     End Set 
    End Property 
    Private Function ShouldSerializeInsertButtons() As Boolean 
     Return _insertButtons.Count > 0 
    End Function 
    Private Sub ResetInsertButtons() 
     InsertButtons = Nothing 
    End Sub 

; download it here.

앞에서 언급했듯이 이것은 내부 용으로 만 사용되는 빠른 & 더티 솔루션입니다. 모두 똑같은, 개선을위한 제안을 주시면 감사하겠습니다.

관련 문제