2013-01-03 60 views
1

您好我現在有這個TableLayoutPanel中安裝在我的計劃,以創建按鈕的一個網格,將在後面對應一個特定的列和行:VB.Net:使用和處理按鈕TableLayoutPanel中

'****INITIALISES TABLE LAYOUT INTO FORM****** 
    Dim ColCount, RowCount As Integer 

    'Later change so that values are automatically calculated 
    ColCount = 5 
    RowCount = 5 

    '*********Copy and pasted from site as example, CHANGE LATER******* 
    Haztable = New TableLayoutPanel 
    Haztable.AutoScroll = True 
    Haztable.Dock = DockStyle.Fill 
    Haztable.ColumnCount = ColCount 
    Haztable.RowCount = RowCount 
    For rowNo As Integer = 0 To Haztable.RowCount - 1 
     For columnNo As Integer = 0 To Haztable.ColumnCount - 1 
      'Dim ctrl As Control = New Button 
      'ctrl.Text = String.Format("{0} {1},{2}", ctrl.GetType().Name, columnNo, rowNo) 
      'ctrl.Size = New Size(20, 20) 
      'Haztable.Controls.Add(ctrl, columnNo, rowNo) 
      Dim buttonname As String 
      buttonname = "B" & columnNo & rowNo 
      Dim button As Control = New Button 
      button.Size = New Size(70, 20) 
      button.Name = buttonname 
      button.Text = buttonname 
      Haztable.Controls.Add(button, columnNo, rowNo) 
      AddHandler button.Click, AddressOf buttonname_Click 
     Next 
    Next 
    Me.Controls.Add(Haztable) 
    Call buttonfind() 

而這一切工作,創建一個按鈕的網格,很像一個Excel電子表格的佈局。

這些按鈕是根據它們的XY位置命名的(例如(1,1)中的按鈕將被稱爲「B11」),但問題是我似乎無法解決如何解決這些按鈕,即

*如果單擊B(XY),則保存布爾值,該按鈕在X,Y處被按下。

用一種算法掃描並檢查是否有任何按鈕已被按下,而不是每個按鈕使用「Select Case」會很好。 我只是在設計器中創建按鈕,但對於我的完整代碼,我將需要1000多個按鈕,這似乎是一種效率低下的方式。

回答

0

您的buttonname_Click應該有一個發件人對象,它是您單擊的按鈕只是將其轉換爲按鈕並檢查名稱。

Private Sub buttonname_Click(sender As System.Object, e As System.EventArgs) 
    Dim btn As Button = CType(sender, Button) 

    Select Case btn.Name 
     Case "B11" 
      'Do something 
     Case "B12" 
      'Do Something esle 

      '........... 
    End Select 

End Sub 

根據您的最後一條語句看看,如果這個工程,你可能需要建立一個數組或列表,如果你需要的其他地方引用的文字在你的程序

Private Sub buttonname_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
    Dim btn As Button = CType(sender, Button) 

    If btn.Text = "H" Then 
     btn.Text = "M" 
    ElseIf btn.Text = "M" Then 
     btn.Text = "L" 
    ElseIf btn.Text = "L" Then 
     btn.Text = "" 
    Else 
     btn.Text = "H" 
    End If 


End Sub 
+0

@Joe的選擇案例是一種避免大規模的If語句的方法。你可能想看看文檔[這裏](http://msdn.microsoft.com/en-us/library/cy37t14y(v = vs.100).aspx) –

+0

你應該創建一個新的類並繼承Button和包括像ClickCount,行,列等變量... – theGD

+0

@Mark這是非常有用的謝謝你。有沒有辦法將所有這些「Select Case」語句合併到一個語句中,這個語句只檢查是否有任何按鈕被按下,如果是,它是在哪裏(X,Y)以及按鈕文本是什麼。對不起,我缺乏理解。 – Joe

0

您有加點擊事件並使用它們的行號和列號處理每個事件。讓自己一個新的按鈕,第一,這樣就可以用消費沒有努力從控制名稱解析列和行號訪問的行數和列數:

Public Class NewButton 
    Inherits Button 
    Public Row, Column, ClickCount as Integer 
End Class 

現在創建和處理:

Public Class Form1 
    Sub addbuttons() 
     Dim newbut As New NewButton 
     newbut.Name = "B12" 
     newbut.Row = "1" 
     newbut.Column = "2" 
     'and other properties... 
     AddHandler newbut.Click, AddressOf clicked 
     Me.Controls.Add(newbut) 
    End Sub 
    Sub clicked(sender As System.Object, e As System.EventArgs) 
     Dim x As NewButton = DirectCast(sender, NewButton) 
     If x.Column = 2 And x.Row = 1 Then 
      x.ClickCount += 1 
     End If 
    End Sub 
End Class 
+0

@Joe更新了我的答案。 – theGD