2012-06-02 76 views
3

我是一個新的程序員vb.net,所以很可能是無知道歉。 我正在爲數據庫接口構建一個簡單的GUI,其中包含許多父項和子項。在表單上,​​我根據多少項目(父母/孩子)創建按鈕。我有創作的按鈕這樣的:vb.net刪除大量動態創建的按鈕

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

在什麼樣的環境VB.NET? WPF?的WinForms?的WebForms? WP7? Silverlight的? MVC? – Oded

回答

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 
3

我會在你的創建循環中添加一些值給Tag屬性。 這將有助於區分您的窗體中靜態創建的按鈕的按鈕創建的按鈕。

Buttoni.Tag = 1 

然後,刪除按鈕,環路上Me.Controls收集相反的順序,
檢查,如果你得到一個按鈕,如果標籤屬性狀態並沒有沒有

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 
+0

@HansPassant,感謝您的編輯。謹慎地闡述討厭的泄漏?我不知道這一點,我有一些代碼,刪除。一個鏈接就夠了。 – Steve

+0

http://stackoverflow.com/a/4195285/17034以及一系列的問題,你會發現從搜索「錯誤創建窗口句柄」 –

+0

@HansPassant再次感謝你,這是巨大的,這一次我怎麼錯過了這一點?明天將是工作中的清潔日。 – Steve

0

創建一個按鈕並雙擊刪除它! 易代碼:

Dim b As New Button 
Private btn As Button ' this is a reference object 
Private ptX, ptY As Integer 
Private drag As Boolean 
Private Sub nodebtn_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    If e.Clicks = 2 Then 
     b.Dispose() 
    End If 

    If e.Button = MouseButtons.Left Then 
     drag = True 
     btn = CType(sender, Button) 
     ptX = e.X : ptY = e.Y 
    End If 
End Sub 

Private Sub nodebtn_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    If drag Then 
     btn.Location = New Point(btn.Location.X + e.X - ptX, btn.Location.Y + e.Y - ptY) 
     Me.Refresh() 
    End If 
End Sub 
Private Sub nodebtn_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    drag = False 
End Sub 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    b.Location = New Point(10, 10) 
    b.Size = New Size(110, 29) 
    b.BringToFront() 
    b.Text = "Button" 
    AddHandler b.MouseDown, AddressOf nodebtn_MouseDown 
    AddHandler b.MouseMove, AddressOf nodebtn_MouseMove 
    AddHandler b.MouseUp, AddressOf nodebtn_MouseUp 
    Me.Controls.Add(b) 
End Sub