2015-05-06 3 views
1

Я хочу сделать программу в VB (.NET), в которой за клик по кнопке в пользовательскую форму добавляется одна или несколько новых кнопок. Этот процесс должен работать бесконечно много раз. Затем кнопки должны вызывать публичный юзер, передавая отдельную переменную, чтобы код знал, от какой кнопки он был вызван (таким образом: знает, что делать).Динамически добавлять код во время выполнения в VB (.NET)

Я узнал, как создавать кнопки во время выполнения с кодом Button = new Button и controls.add(Button). Мне также удалось передать новый код кнопке с помощью WithEvents или AddHandler. Но до сих пор мне всегда нужно, чтобы код был готов до запуска программы. То есть Мне нужно знать имя кнопки заранее и подготовить код.

Есть ли способ динамически создать код, отрезанный во время выполнения, который будет указывать на ранее существовавший?

Я дам вам simplyfied пример:

WithEvents NewButton01 As New Button 
WithEvents NewButton02 As New Button 
WithEvents NewButton03 As New Button 

Private Sub AddNewButton_Click() Handles AddNewButton.Click 

    NewButton01.Location = New Point(10, 10) 
    NewButton01.Text = "01" 
    Controls.Add(NewButton01) 

    NewButton02.Location = New Point(50, 50) 
    NewButton02.Text = "02" 
    Controls.Add(NewButton02) 

    NewButton03.Location = New Point(90, 90) 
    NewButton03.Text = "03" 
    Controls.Add(NewButton03) 

End Sub 

Private Sub NewButton01_click() Handles NewButton01.Click 
    Call MessageBox(1) 
End Sub 

Private Sub NewButton02_click() Handles NewButton02.Click 
    Call MessageBox(2) 
End Sub 

Private Sub NewButton03_click() Handles NewButton03.Click 
    Call MessageBox(3) 
End Sub 

Private Sub MessageBox(flag As Integer) 
    MsgBox("You activated button number " & flag) 
End Sub 

Как вы можете видеть, это очень непрофессионально способ кодирования. Кроме того, я бы хотел, чтобы количество кнопок было создано бесконечно, поэтому я не могу использовать этот код. Я бы предпочел, чтобы VB создавал новую кнопку каждый раз, когда я нажимаю «AddNewButton» и пишу код, который ссылается на Private Sub MessageBox или на любой другой код, который может быть в конце.

Я очень новичок в VB.Net, поэтому, пожалуйста, простите меня, если в примерах содержится что-нибудь, что заставляет вас дрожать.

И большое спасибо!

ответ

2

Нечто подобное могло бы помочь:

Private Sub AddNewButton_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim lastButtonPos As Integer = 10 
     For i = 1 To 3 
      Dim NewButton As New Button 
      NewButton.Location = New Point(lastButtonPos, lastButtonPos) 
      NewButton.Text = "0" & i.ToString 
      NewButton.Name = i.ToString 
      AddHandler NewButton.Click, AddressOf Button_click 
      Controls.Add(NewButton) 
      lastButtonPos = lastButtonPos + 40 
     Next 

    End Sub 

    Private Sub Button_click(ByVal sender As Object, ByVal e As EventArgs) 
     Dim clickedButton As Button = CType(sender, Button) 
     Dim clickedNumber As Integer = clickedButton.Name 
     Call MessageBox(clickedNumber) 
    End Sub 

    Private Sub MessageBox(flag As Integer) 
     MsgBox("You activated button number " & flag) 
    End Sub 
+2

Вы должны были бы сделать lastButtonPos Static или сделать его переменный класс, чтобы использовать это несколько раз. Вместо этого я бы использовал FlowLayoutPanel и просто выполнил FlowLayoutPanel1.Controls.Add (NewButton), так что для вас все позиционируется. – Capellan

+0

Да, я согласен, что реализация может быть лучше, но я хотел показать назначение обработчика динамического события и литье типов в обработчике событий. Я помню, как это было интересно, когда я понял о типе каста: D –

+0

Спасибо за код! Это действительно работает, но мне все же нужно понять, что там происходит. Получаю ли я это право: «отправитель» - это переменная, которая сообщает Private Sub, откуда она была выполнена. В этом случае «отправителем» является кнопка1. Теперь вы заставляете кнопку «button1» становиться кнопкой и назначаете ее только что определенной кнопке «clickedButton»? – offeltoffel

Смежные вопросы