DOBON.NET DOBON.NETプログラミング掲示板過去ログ

コレクションエディタ登録時に値のチェック

環境/言語:[WindowsXP VB.NET2003]
分類:[.NET]

こんばんは。

以前、「INT配列のコレクションエディタについて」
質問したものです。

じゃんぬさんに言われたとおり
CollectionBaseを継承して、コレクションエディタでINT配列を
作成、編集、削除できるようになりました。

ここでまた2つほど質問なのですが、
1.値の初期値を最初は0で次からは前回+1にしたい。
2.値をエディタで入力したとき、すでに登録してある値であればメッセージ表示でエラーを促す。
ということをしたいのですが、どうすればいいのか分かりません。
CollectionEditor・UITypeEditorなどがひっかかってはいるのですが、
何か具体的な事例みたいなものが載っているHPなどがあればご紹介ください。

ちなみに長いのですが、現状のソースを載せておきます。
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Windows.Forms


'アイテム
<ToolboxItem(False), DesignTimeVisible(False)> _
Public Class _Data

Inherits Component

Private mInt As Int16

Public Property INT() As Int16
Get
Return mInt
End Get
Set(ByVal Value As Int16)
mInt = Value
End Set
End Property

End Class

'アイテムを保持するコレクション
Public Class _Collection

Inherits CollectionBase

Private UCtl As _UserControl

Public Sub New(ByVal value As _UserControl)
UCtl = value
End Sub

Default Public ReadOnly Property Item(ByVal index As Int32) As _Data
Get
Return CType(List(index), _Data)
End Get
End Property

Public Function Add(ByVal value As _Data) As _Data
List.Add(value)
Return value
End Function

End Class

'コレクションを保持するコントロール
Public Class _UserControl
Inherits System.Windows.Forms.Control

Private myint16 As _Collection

#Region " Windows フォーム デザイナで生成されたコード "

Public Sub New()
MyBase.New()

' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()

' InitializeComponent() 呼び出しの後に初期化を追加します。
myint16 = New _Collection(Me)

End Sub

' UserControl1 は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer

' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
'Windows フォーム デザイナを使って変更してください。
' コード エディタを使って変更しないでください。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
components = New System.ComponentModel.Container
End Sub

#End Region

Public Property Items() As _Collection
Get
Return myint16
End Get
Set(ByVal Value As _Collection)
myint16 = Value
End Set
End Property

End Class
#エディタの詳細についてはわかりません(汗

> 1.値の初期値を最初は0で次からは前回+1にしたい。

この場合の「初期値」はアイテムオブジェクトにとっての抽象的な値ではないので
その外、つまりコレクションが管理するしかありません。

> 2.値をエディタで入力したとき、すでに登録してある値であればメッセージ表示でエラーを促す。
> Public Function Add(ByVal value As _Data) As _Data
> List.Add(value)
> Return value
> End Function

エラーの判断のタイミングがインスタンス登録時である場合、
インスタンス作成を含むインターフェースを制限する必要があるでしょう。
#引用したAddは外部の何者かがインスタンスを作成しているということです。

エディタの操作時はアイテムインスタンスがすでに存在してると思うのですが、
となれば確定時にコレクションに実装したチェックが実行されなければなりません。
また、1についてもエディタが新規インスタンスを作成した際に
コンストラクタへ初期値を渡す必要などが出てくるでしょう。

#エディタでコレクションのカスタム実装を呼び出せれば。。。
■No13330に返信(まどかさんの記事)
> #エディタの詳細についてはわかりません(汗
>
>>1.値の初期値を最初は0で次からは前回+1にしたい。
>
> この場合の「初期値」はアイテムオブジェクトにとっての抽象的な値ではないので
> その外、つまりコレクションが管理するしかありません。

ありがとうございます。

_Collectionにて管理することが出来ました。
CollectionEditorを実装しSetItemsにて、_CollectionのAddで追加および、
_Collectionの管理変数を使用することで可能になりました。
又、削除時も同様にCanRemoveInstanceにて、_Collectionの管理変数を変更し
管理できるようにしました。

>>2.値をエディタで入力したとき、すでに登録してある値であればメッセージ表示でエラーを促す。
>> Public Function Add(ByVal value As _Data) As _Data
>> List.Add(value)
>> Return value
>> End Function
>
> エラーの判断のタイミングがインスタンス登録時である場合、
> インスタンス作成を含むインターフェースを制限する必要があるでしょう。
> #引用したAddは外部の何者かがインスタンスを作成しているということです。
>
> エディタの操作時はアイテムインスタンスがすでに存在してると思うのですが、
> となれば確定時にコレクションに実装したチェックが実行されなければなりません。
> また、1についてもエディタが新規インスタンスを作成した際に
> コンストラクタへ初期値を渡す必要などが出てくるでしょう。
>
> #エディタでコレクションのカスタム実装を呼び出せれば。。。
>

こちらもCollectionEditorのEditValueにて
VALUE値を型変換し内容をチェックし、重複していればメッセージにて警告し、
GOTOにて修正しなければEditValueを抜けられなくして目的達成できました!!

まどかさん、助言ありがとうございました!!\(^o^)/
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板