動的に作成したボタンを削除するには?


ガリット  2009-07-05 22:29:27  No: 142168

こんにちは、
ただ今、VB.NET・Visual Studio2005・XP SP3で、
MonthCalendarコントロールを使用したWindowsアプリケーションを作成しております。
そこで質問なのですが、カレンダー(DataGridViewで作成)の横に行事名が書いてあるボタンを並べて、
そのボタンを、ドラック&ドロップで、カレンダーの上に持っていき、
更に、そのボタンを右クリックでサイズを変更し、
そのボタンの下にある日付にボタンに書いてある行事をデータベースに登録するというものを作成しております。それで、石飛びの処理(1日空いて次の日にボタンを再配置する)をやっているのですが、ボタンをカレンダーの上を
ダブルクリックで、その場に新規で作成するというものを考えており、ボタンを作成はうまくいったのですが、その新規で作成したボタンを削除するという処理がうまくできなくって困っております。一応、ダブルクリックで新規に作成する処理は、

〜メンバ変数〜
Dim Winter_Vacation_Count As Integer
Dim Winter_Vacation_Btn As New Button() 
Dim Winter_Vacation_Count as integer

    Private Sub DGV_Cal_MouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DGV_Cal.MouseDoubleClick

〜省略〜

'動的に作成するボタンのインスタンスを生成
            Winter_Vacation_Btn = New Button

            '追加するButtonのプロパティを設定する
            Winter_Vacation_Btn.Name = "Btn_Winter_Vacation" & Winter_Vacation_Count        'Label_Name
            Winter_Vacation_Btn.BackColor = Color.SkyBlue           'BackColor
            Winter_Vacation_Btn.Font = New Font("MS UI Gothic", 12) 'Font
            Winter_Vacation_Btn.ForeColor = Color.Purple            'ForeColor
            Winter_Vacation_Btn.Location = New Point(e.X, e.Y)      'Location
            Winter_Vacation_Btn.Size = New Size(120, 30)            'Size
            Winter_Vacation_Btn.Text = "冬季休暇"                   'Text

            '行事ボタンを、Formに追加する
            DGV_Cal.Controls.Add(Winter_Vacation_Btn)

            'Winter_Vacation_Countに、1を足す
            Winter_Vacation_Count = Winter_Vacation_Count + 1

            '行事ボタンを、最前面にする
            Winter_Vacation_Btn.BringToFront()

End Sub

となっており、削除する処理は、複数ある可能性があるので、ボタンで行っています。そのボタンの処理が、

Private Sub Btn_Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Cancel.Click

For Each ctrl As Control In DGV_Cal.Controls

            If ctrl.Name Like "Btn_Winter*" Then

                DGV_Cal.Controls.Remove(ctrl)

            End If

        Next

となっております。この処理で実行すると、なぜか複数(5〜6個)のボタンを配置すると、いくつか削除されて、いくつかは残ってしますのです。
念のため、確認したのが、一応該当するコントロールが取得されているか、
ListBoxに表示させてみたら、全て取得されていました。
デバックをしてみると、Removeを入れると、このような現象が起こりました。
この解決方法を知っていたら、どなたかぜひご教授下さい。
お願いします。


特攻隊長まるるう  2009-07-12 18:27:45  No: 142169

単純に削除したら Index が振りなおされるからじゃない?
    Private Sub Btn_Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Cancel.Click
        For Each ctrl As Control In DGV_Cal.Controls
            Debug.WriteLine("----------------------")
            For index As Integer = 0 To DGV_Cal.Controls.Count - 1
                Debug.WriteLine(index.ToString & ":" & DGV_Cal.Controls.Item(index).Name)
            Next

            If ctrl.Name Like "Btn_Winter*" Then
                Debug.WriteLine("Remove:" & ctrl.Name)
                DGV_Cal.Controls.Remove(ctrl)
            End If
        Next
    End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加