- PR -

[VB2005] サブプロパティが変更された時の親プロパティSet

1
投稿者投稿内容
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-09-07 18:13
どこかで見たような気がするのですが、google/ここの過去ログ/どぼんさんのHP等で、
探してみたのですが、キーワードが悪いのか、見つかりませんでした。
参考URL等教えていただけないでしょうか?


サブプロパティが変更された場合、親プロパティのSetが実行されない。

コード:
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim testBBB As BBB = New BBB
        testBBB.BBB.AAA = "あいうえお"
    End Sub

    Public Class AAA
        Private FAAA As String
        Public Property AAA() As String
            Get
                Return FAAA
            End Get
            Set(ByVal value As String)
                FAAA = value

                Form1.Text = FAAA
            End Set
        End Property
    End Class

    Public Class BBB
        Private FBBB As AAA = New AAA

        Public Property BBB() As AAA
            Get
                Return FBBB
            End Get
            Set(ByVal value As AAA)
                FBBB = value                    ' <-実行されない
                Form1.Text += "/" + FBBB.AAA    ' <-実行されない
            End Set
        End Property
    End Class

End Class


ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-09-07 18:18
あくまで
testBBB.BBB.AAA = "あいうえお"
なんでしょ?

BBBは関係ないじゃん。

testBBB.BBB = new BBB();

でsetterが動かないのは何故だ!ってわめいているのと変わらんよ。
わからんかな?

だいたいサブプロパティってなに?
用語の使い方が違うよ。サブじゃないでしょ。
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2006-09-07 18:32
Setが実行されるのは、
内容が変更されたときではありません。

内容が、=で代入されたときです。

ですから、実行されなくて当然ということですね。


変更されたときに動いてほしいこともありますけど。今のところ無理なのではないかな。
少なくともSetという仕組みでは無理です。

[ メッセージ編集済み 編集者: まりも 編集日時 2006-09-07 18:35 ]
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-09-07 18:35
クラスAAAにプロパティAAAが変更された場合に発生させるイベントを作って
クラスBBBはクラスAAAをNewした時に、そのイベントにコールバックメソッドを設定すれば可能です。

#追記
もちろんプロパティBBBのセッターの処理は実行されないので
コールバックメソッドに処理を書く必要があります。


[ メッセージ編集済み 編集者: burton999 編集日時 2006-09-07 18:46 ]
うきょきょ
常連さん
会議室デビュー日: 2004/01/09
投稿数: 44
投稿日時: 2006-09-08 10:49
To:ぶさいくろうさん
引用:

サブプロパティってなに


(testBBB.BBB)プロパティの(AAA)プロパティって意味で使いました。
MSDNの「プロパティの概要」を読み直していて、そこで出てきます。

To:まりもさん
引用:

内容が、=で代入されたときです。


確かにその通りでした。
この考え方だと、セッターが実行されなくて当たり前なんですよね。
一応burton999さんの方法で、期待通りできたので良いかなって思っています。

To:burton999さん
引用:

クラスAAAにプロパティAAAが変更された場合に発生させるイベントを作って
クラスBBBはクラスAAAをNewした時に、そのイベントにコールバックメソッドを設定すれば可能です。


上記の方法で、期待通り動きました。
以下検証コードを記します。

コード:
Public Class Form1

	Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Dim testBBB As BBB = New BBB
		testBBB.BBB.AAA = "あいうえお"
	End Sub

	Public Class AAA
		Public Event SetAAAEvent(ByVal value As AAA)
		Private FAAA As String
		Public Property AAA() As String
			Get
				Return FAAA
			End Get
			Set(ByVal value As String)
				FAAA = value
				Form1.Text = FAAA

				RaiseEvent SetAAAEvent(Me)
			End Set
		End Property
	End Class

	Public Class BBB
		Private FBBB As AAA

		Public Sub New()
			FBBB = New AAA
			AddHandler FBBB.SetAAAEvent, AddressOf SetAAAEvent
		End Sub

		Private Sub SetAAAEvent(ByVal value As AAA)
			FBBB = value
			Form1.Text += "/" + FBBB.AAA
		End Sub

		Public Property BBB() As AAA
			Get
				Return FBBB
			End Get
			Set(ByVal value As AAA)
				Me.SetAAAEvent(value)
			End Set
		End Property
	End Class

End Class


ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2006-09-08 11:00
引用:

うきょきょさんの書き込み (2006-09-08 10:49) より:
To:ぶさいくろうさん
引用:

サブプロパティってなに


(testBBB.BBB)プロパティの(AAA)プロパティって意味で使いました。
MSDNの「プロパティの概要」を読み直していて、そこで出てきます。



MSDNみてみました。
これの事みたいですね。

引用:

プロパティのデータ型が列挙型の場合、Microsoft Visual Studio などの開発環境では、そのプロパティは [プロパティ] ウィンドウにドロップダウンリストとして表示されます。プロパティのデータ型が、いくつかのプロパティを持つクラスである場合、クラスに含まれているこれらのプロパティは、定義するプロパティのサブプロパティと呼ばれます。Visual Studio の [プロパティ] ウィンドウでは、プロパティを展開してそのサブプロパティを表示できます。


1

スキルアップ/キャリアアップ(JOB@IT)