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関数にオーバーライドを追加しました。コードは以下の通りです:

私はまた、コレクションからリストに移動しました - 私はもっと安全に行く方法を読んでいました。また、私のCustomSettingsクラスに、EmailAddressesプロパティを新しいList(Of String)に設定するコンストラクタを追加しました。私はそれが走った最初の時間は、私はリストを編集して項目を追加することを見出し、彼らは永続化されません。

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

そして、それが必要のように、今ではすべての働いています。しかし、これが最善の方法でない場合、またはそれを行うより簡単な方法がある場合は、チャイムしてください。

関連する問題