3

私は vb.net の新しいプログラマーなので、無知である可能性が高いことをお詫びします。多くの親アイテムと子アイテムを含む、データベース インターフェイス用のシンプルな GUI を作成しています。フォーム上で、アイテム (親/子) の数に応じてボタンを作成します。このようにボタンを作成しました:

For RowNumber As Integer = 0 To NoOfRows
        Dim Buttoni As New Button
        Buttoni.Location = New Point(LocationX, LocationY)
        Buttoni.Width = 100
        Buttoni.Height = 40
        Buttoni.Visible = True
        Buttoni.Text = DatasetA.Tables(0).Rows(RowNumber).Item("Name")
        ButtonName = "Button" + RowNumber.ToString

        If LocationX < FormWidth - (SpacePerButtonX * 2) Then
            LocationX = LocationX + SpacePerButtonX
        Else
            LocationX = 50
            LocationY = LocationY + SpacePerButtonY
        End If

        AddHandler Buttoni.Click, AddressOf DynamicButtonClick
        Me.Controls.Add(Buttoni)
        Buttoni.BringToFront()  'brings newest buttons to front!
    Next

しかし、ボタンを削除して新しいセットに置き換える方法に苦労しています...クリックすると1つのボタンを削除できますが、作成されたすべてのボタンを削除したいですそれらを再作成する前に、この方法で。

それが理にかなっており、これを達成するためのかなり簡単な方法があることを願っています..?

4

3 に答える 3

3

作成ループで、Tagプロパティに値を追加します。これは、動的に作成されたボタンと、フォームで静的に作成されたボタンを区別するのに役立ちます。

Buttoni.Tag = 1

次に、ボタンを削除するには、Me.Controlsコレクションで逆の順序でループし、
ボタンを取得するかどうか、およびTagプロパティがIsNotNothingであるかどうかを確認します。

For x as Integer = Me.Controls.Count - 1 to 0 step -1)
    Dim b as Button = TryCast(Me.Controls(x), Button)
    If b IsNot Nothing AndAlso b.Tag IsNot Nothing then
        b.Dispose()       '' NOTE: disposing the button also removes it
    End If
Next
于 2012-06-02T19:28:50.037 に答える
1

あなたが何をしたいのかを正確に知るのは難しいです。同じテクニックを逆に使うこともできると思います。

        For i As Integer = Me.Controls.Count - 1 To 0 Step -1
            Dim ctrl = Me.Controls(i)

            If TypeOf (ctrl) Is Button Then
               ctrl.Dispose()           '' NOTE: disposing the control also removes it
            End If
        Next
于 2012-06-02T19:27:47.560 に答える