1

사용자 지정 설정 클래스에서 컬렉션을 유지하는 방법을 구현하려고합니다. 나는 성공적으로 설정 클래스 (ApplicationSettingsBase 상속)를 만들었으며 PropertyGrid에 내장 된 편집기를 사용하여 속성을 저장할 수 있지만 컬렉션에 대한 속성 격자의 사용자 정의 구현은 내가 추가 한 값을 유지하지 않습니다. 내 코드는 다음과 같습니다.사용자 지정 CollectionEditor는 속성의 "set"메서드를 트리거하지 않습니다.

Imports System.Configuration 
Imports System.ComponentModel 
Imports System.Drawing.Design 
Imports System.ComponentModel.Design 

Public Class CustomSettings 
    Inherits ApplicationSettingsBase 

    <UserScopedSetting()> _ 
    <DefaultSettingValue("White")> _ 
    Public Property BackgroundColor() As Color 
     Get 
      BackgroundColor = Me("BackgroundColor") 
     End Get 
     Set(ByVal value As Color) 
      Me("BackgroundColor") = value 
     End Set 
    End Property 

    <UserScopedSetting()> _ 
    <DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _ 
    <Editor(GetType(CustomStringCollectionEditor), GetType(UITypeEditor))> _ 
    Public Property EmailAddresses() As Collection 
     Get 
      EmailAddresses = Me("EmailAddresses") 
     End Get 
     Set(ByVal value As Collection) 
      Me("EmailAddresses") = value 
     End Set 
    End Property 
End Class 

Public Class CustomStringCollectionEditor 
    Inherits CollectionEditor 

    Public Sub New() 
     MyBase.New(GetType(Collection)) 
    End Sub 

    Protected Overrides Function CreateInstance(ByVal itemType As System.Type) As Object 
     Return String.Empty 
    End Function 

    Protected Overrides Function CreateCollectionItemType() As System.Type 
     Return GetType(String) 
    End Function 
End Class 

BackgroundColor 속성과 EmailAddresses 속성 모두에 대해 Set 메서드에 중단 점을 설정했습니다. BackgroundColor 속성은 Set 문에서 중단되어 올바르게 저장됩니다. 그러나 사용자 정의 CollectionEditor 대화 상자를 닫으면 EmailAddresses "Set"메서드가 호출되지 않습니다. 편집이 끝나면 내 사용자 정의 편집기에서 실제로 속성을 저장하도록하려면 어떻게해야합니까?

답변

1

나는 (this question의 도움으로) 문제를 해결했다고 생각합니다. 내 사용자 지정 편집기에서 EditValue 함수에 재정의를 추가했습니다. 코드는 다음과 같습니다.

나는 컬렉션에서 목록으로 옮겼습니다. 나는 더 안전한 곳으로 읽었습니다. 또한 EmailAddresses 속성을 새 List (Of String)로 설정하는 CustomSettings 클래스의 생성자를 추가했습니다. 나는 처음 실행, 나는 목록을 편집하고 항목을 추가 할 수 있다는 것을 발견,하지만 그들은 지속되지 않을 것이다 :

Public Sub New() 
    If Me("EmailAddresses") Is Nothing Then 
     Me("EmailAddresses") = New List(Of String) 
    End If 
End Sub 

을 그리고 그것은해야처럼 지금은 모든 작업입니다. 하지만 이것이 최선의 방법이 아니면 더 쉬운 방법이 있다면, 안으로 들어 오십시오.

관련 문제