2016-12-07 1 views
0

私は間違った言葉遣いを使用した場合、私はVisual Basicにはかなり新しいです。個々のイベントプロシージャの外側でクリックされたボタンの名前を取得する方法

1つのフォームに小さなボタンがたくさんあり、クリックしたときにボタンの名前を取得する統一的な方法があるのだろうかと思っていました。たくさんのボタンがあるので、それぞれのボタンをコーディングする必要はありませんが、クリックしたときにボタンの名前を取得し、名前から何かを取得する1つのメソッドがあります。私はこれがまったく可能かどうかはわかりませんが、プログラムをもっと簡単にするでしょう。

+1

タイトルは非常に明確ではありません。ボタンをクリックすると、名前を取得できるクリックハンドラが呼び出されます。 – Plutonix

+0

私は、各ボタンをダブルクリックする必要はなく、個別の手順の外でそれを単式で行う方法があれば、個々のボタンをコーディングする必要があるということです。各ボタンには、ボタンの名前に応じてわずかに変更された同様のコードがあります。 – AshIsBlue

+1

生成されたクリックハンドラを使用する代わりに、単一のハンドラを作成し、新しいハンドラへの各ボタンの追加ハンドラをloadフォームで実行できます。新しいハンドラでは、特定のコードを実行するために、クリックされたコントロール名に巨大なselect文(またはif-elseをカスケードする)があります。しかし、これは誤ったメリットです。私の意見では、タスクに固有のより小さな特定のモジュールを用意するよりも、1つの大きなルーチンを作成しています。将来のメンテナンスのためには、かなり難しくなります。 – MarkL

答えて

0

ボタンの名前をプログラムで実行できる場合は、ボタンをプログラムで作成する必要があります。テキストボックスにも同様の問題がありました。ここで私はそれらをオンザフライで生成するために使用したコードの一部です。おそらく、その場でボタンを作成するモデルとして使うことができます。

Private Class cCell 
    Private value As Integer 
    Private cellTB As TextBox 

    Public Sub New(ByVal idx As Integer, ByVal col As Integer, ByVal row As Integer) 
     value = 0 
     cellTB = mkTB(idx, col, row) 
     Form1.Controls.Add(cellTB) 
    End Sub 

    Private Function mkTB(ByVal idx As Integer, ByVal col As Integer, ByVal row As Integer) 
     Dim tb As New TextBox 
     tb.Top = Form1.cMargin + row * (Form1.cUnit + Form1.cMargin) + Int(row/3) * Form1.cMargin * 3 
     tb.Left = Form1.cMargin + col * (Form1.cUnit + Form1.cMargin) + Int(col/3) * Form1.cMargin * 3 
     tb.Width = Form1.cUnit 
     tb.Height = Form1.cUnit 
     tb.Name = "cellTB" & idx.ToString 
     tb.Text = "" 
     AddHandler tb.TextChanged, AddressOf cCell_TextChanged 
     Return tb 
    End Function 

    Private Sub cCell_TextChanged() ' change text event handler for the cells textbox 
     If IsNumeric(cellTB.Text) Then 
      If cellTB.Text > 9 Or cellTB.Text < 1 Then 
       cellTB.Text = "" 
      Else 
       cellTB.Font = New Font(cellTB.Font, FontStyle.Bold) 
       cellTB.ForeColor = Color.Black 
       value = cellTB.Text 
       trimPList() 
      End If 
     Else 
      cellTB.Text = "" 
     End If 
    End Sub 
End Class 

    Private Sub mkCells() 
     Dim idx As Integer 
     Dim col As Integer 
     Dim row As Integer 

     For idx = 0 To 80 
      row = Int(idx/9) 
      col = idx Mod 9 
      aCells(idx) = New cCell(idx, col, row) 
     Next 
    End Sub 
1

その後、あなたはコンストラクタ

Public Sub New() 
    InitializeComponents() 

    AddHandler button1.Click, AddressOf Button_Click 
    AddHandler button2.Click, AddressOf Button_Click 
    AddHandler button3.Click, AddressOf Button_Click 
    ' ... 
End Sub 

または「読みにくく」を使用中のすべてのボタンにこのハンドラを「付ける」ことができ、すべてのボタンに

Private Sub Button_Click(sender As Object, e As EventArgs) 
    Dim button As Button = DirectCast(sender, Button) 
    Dim name As String = button.Name 
    ' use name 
End Sub 

を一つだけのイベントハンドラを作成し、大量のコントロールの場合、アプローチ - Handlesキーワード

Private Sub Button_Click(sender As Object, e As EventArgs) Handles button1.Click, 
                    button2.Click, 
                    button3.Click, 
                    button4.Click 
    ' code 
End Sub 
パラメータの種類は、あなたが期待される型に parameterをキャストし、それを使用する必要 objectあるので sender
-

通常イベントを発生させたコントロールのインスタンスを提供するEventHandler。

関連する問題