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

動的に作成したコントロールの配列の開放方法

環境/言語:[OS : Windows XP / 言語 : Visual Basic .NET]
分類:[.NET]

【解決したい問題】

「http://dobon.net/vb/dotnet/control/buttonarray.html」の最初の[VB.NET]のサンプルコードに従って動的にコントロールの配列を
作成したのですが、インスタンス化されたコントロールを開放する
方法をご教授いただけませんでしょうか。

Me.SuspendLayout()

Dim i As Integer
For i = Me.testButtons.Length - 1 to 0 Step -1
'インスタンスの開放
Me.testButtons(i).Dispose()
Next i

Me.ResumeLayout(False)

エラー無く実行されますが、実際には開放されません。

【解決するために何をしたか】

For i = Me.testButtons.Length - 1 to 0 Step -1
'インスタンスの開放
Me.testButtons(i).Dispose()
Me.testButtons(i) = Nothing
Next i

を試してみましたが、駄目でした。

ネット上で、"Visual Basic" dispose "array of controls" などを検索してみましたが、有益な情報が見つかりませんでした。

よろしくお願いいたします。
■No26056に返信(arturo_takさんの記事)
> インスタンス化されたコントロールを開放する
> 方法をご教授いただけませんでしょうか。

Controls.Add/AddRange で追加したコントロールを、
フォームの終了を待たずに破棄したい場合には、それらを
Controls.Remove/RemoveAt してから Dispose してください。

もし、AddHandler でイベントの割り当てを行っていた場合には、
Dispose 前に、RemoveHandler でイベント解除も行っておきます。


ちなみにフォームの終了処理に任せる場合には、自分で Dispose を
呼び出す必要はありません。Controls に登録したままにしておけば、
終了時に自動的に Dispose されるはずです。
魔界の仮面弁士さん、ご教授いただきまして誠にありがとうございます。
色々と解除しなければいけなかったのですね。
お蔭様でコントロール配列を開放することができました。

Me.SuspendLayout()

Dim i As Integer
For i = Me.testButtons.Length - 1 to 0 Step -1
RemoveHandler Me.testButtons(i).Click, _
AddressOf Me.testButtons_Click
Me.Controls.Remove(Me.testButtons(i))
Me.testButtons(i).Dispose()
Next i

Me.ResumeLayout(False)
解決済み!
■No26066に返信(arturo_takさんの記事)
> For i = Me.testButtons.Length - 1 to 0 Step -1

このループ中では、testButtons 配列の中身が増減する事は無いので、
必ずしも降順検索する必要は無いと思います。この場合には、

For Each btn As Button In testButtons
 RemoveHandler btn.Click, AddressOf testButtons_Click
 Controls.Remove(btn)
 btn.Dispose()
Next

などと書く事ができるかと。
解決済み!
魔界の仮面弁士さん

なるほど。簡潔でいいですね。
大変勉強になります。

ありがとうございました。
解決済み!

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