2015-03-26 4 views
0

У меня есть строковый массив Globals.stringArray, который заполняет список элементов управления в зависимости от количества записей в массиве. Я хочу отслеживать, сколько раз используется элемент управления (например, нажатие кнопки) с целым числом, которое я буду использовать и отображать позднее.Как создавать переменные динамически на основе массива строк?

Я предполагаю, что требуется динамически созданная глобальная переменная в зависимости от того, сколько элементов управления создано (в зависимости от количества элементов в массиве строк).

Во-вторых, как бы я это сделал и как бы получить доступ к этим переменным впоследствии?

Вот что у меня есть:

Public Shared Sub dynamicVariables() 
    Dim variables As New Dictionary(Of String, Integer)() 
    variables("MyDynamicVariable") = Globals.stringArray.Length 
End Sub 

Я предполагаю, что я могу добавить dynamicVariables() в котором создаются мои кнопки, чтобы запустить его в сочетании с этим и сопоставить переменные с кнопками?

EDIT: (с предложениями)

Public Class Form2 

Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    AddNewButton() 

End Sub 

Public Sub AddNewButton() 

    Dim buttonTop As Integer = 100 

    For Each item As String In Globals.candidates 
     Dim btn As New System.Windows.Forms.Button() 
     Dim Location As New Point(100, (buttonTop + 20)) 
     btn.Location = Location 
     btn.Text = item 
     btn.Width = 150 
     AddHandler btn.Click, AddressOf Me.buttonClick 
     Me.Controls.Add(btn) 
     buttonTop += 20 
    Next 

End Sub 

Private Sub buttonClick(sender As Object, e As EventArgs) 

    Dim btn As Button = DirectCast(sender, System.Windows.Forms.Button) 
    Dim result As Integer = MessageBox.Show(String.Format("Did you select {0} ?", btn.Text), "Confirmation", MessageBoxButtons.YesNo) 
    If result = DialogResult.Yes Then 
     Dim usage As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer) 

     If usage.ContainsKey("myButtonName") Then 
      usage("myButtonName") += 1 
     Else 
      usage.Add("myButtonName", 1) 
     End If 
    Else 
     MessageBox.Show("No pressed") 
    End If 

End Sub 

End Class 

EDIT 2: (с предложениями)

Public Class Form2 

    Private Sub From2_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

     AddNewButton() 

    End Sub 

    Public Sub AddNewButton() 

     Dim buttonTop As Integer = 100 

     For Each item As String In Globals.candidates 
      Dim btn As New System.Windows.Forms.Button() 
      Dim Location As New Point(100, (buttonTop + 20)) 
      btn.Location = Location 
      btn.Text = item 
      btn.Width = 150 
      AddHandler btn.Click, AddressOf Me.buttonClick 
      AddHandler btn.Click, AddressOf Me.ClickCounter 
      Me.Controls.Add(btn) 
      buttonTop += 20 
     Next 

    End Sub 

    Private Sub buttonClick(sender As Object, e As EventArgs) 

     Dim btn As Button = DirectCast(sender, System.Windows.Forms.Button) 

     Dim result As Integer = MessageBox.Show(String.Format("Did you select {0} ?", btn.Text), "Confirmation", MessageBoxButtons.YesNo) 

     If result = DialogResult.Yes Then 

      'Yes clicked. Add 1 to counter and show next screen. ??? 

     Else 

      'No clicked. Return to screen to make proper selection. 

     End If 

    End Sub 

    Private Sub ClickCounter(sender As Object, e As EventArgs) 

     Dim btn As Button = TryCast(sender, Button) 

     Dim usage As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer) 

     If btn Is Nothing Then Return 

     If Not usage.ContainsKey(btn.Name) Then 

      usage.Add(btn.Name, 0) 
      usage(btn.Name) += 1 

     End If 


    End Sub 

End Class 
+0

Это приложение для веб-приложений или окон? – Yatrix

+0

winforms, я добавил тэг – user3029953

ответ

0

Для каждого действия элемента управления позволяет, вы должны добавить 1 к вашему колу. Итак, создайте глобальную переменную, либо в модуле с общей переменной. Словарь - это правильный путь, но вам не нужно пытаться дать ему длину, поскольку он изменен. Мой VB немного ржавый, но вы должны получить суть.

'In your button click event 

Dim usage As Dictionary(string, integer) = new Dictionary(string, Integer) 

If usage.ContainsKey("myButtonName") then 
    usage("myButtonName") += 1 
Else 
    usage.add("myButtonName", 1) 
end if 

Ваше имя будет ключевым, а значение будет значением.

+0

Он говорит мне, что выражение «Expression is not valid valid» для оператора Else. – user3029953

+0

@ user3029953 Я забыл .add. Это должно работать сейчас. – Yatrix

+0

Я отредактировал свой код в соответствии с тем, что, по моему мнению, уместно. Можете ли вы посмотреть? Я написал выше с редактированием. – user3029953

0

Я бы сделал это свойство элементов управления Button напрямую, вместо того чтобы пытаться отслеживать в глобальной переменной где-то.

Для этого я наследую новый элемент управления от Button и добавлю свойство с именем что-то вроде TimesClicked. Затем я добавлю обработчик событий (помню: события могут иметь более одного обработчика) к новому типу управления, который обновляет это свойство каждый раз при нажатии кнопки. Теперь я могу заменить все существующие кнопки этим новым элементом управления.

Если это слишком много хлопот, я бы до сих пор строите от того факта, что события могут иметь более одного обработчик, чтобы избежать загромождений регулярного кода кнопки ответа с кодом шаблонных счетов:

Private Sub ClickCounter(sender As Object, e As EventArgs) 
    Dim btn As Button = TryCast(sender, Button) 
    If btn Is Nothing Then Return 

    If Not usage.ContainsKey(btn.Name) Then usage.Add(btn.Name, 0) 
    usage(btn.Name) += 1 
End Sub 

Либо Кстати, ваш метод AddButton() будет выглядеть примерно так:

Public Sub AddNewButton() 

    Dim buttonTop As Integer = 100 

    For Each item As String In Globals.candidates 
     Dim btn As New System.Windows.Forms.Button() 
     Dim Location As New Point(100, (buttonTop + 20)) 
     btn.Location = Location 
     btn.Text = item 
     btn.Width = 150 
     AddHandler btn.Clikc, AddressOf Me.ClickCounter 
     AddHandler btn.Click, AddressOf Me.buttonClick 
     Me.Controls.Add(btn) 
     buttonTop += 20 
    Next 

End Sub 

Это также позволит вам расширить этот метод ClickCounter принимать и количество использует другие виды контроля и события, не возвращаясь для редактирования изменить кнопки.

+0

Я думаю, что понимаю, что вы предложили, однако, я чувствую, что в этом примере вам что-то не хватает. Вы используете «использование», которое не было повторно объявлено. Я предполагаю, что использование Dim в качестве словаря (Of String, Integer) = Новый словарь (Of String, Integer) должен быть с помощью ClickCounter Sub? – user3029953

+0

Нет. Если вы поместите его там, который существует только при запуске метода. –

+0

Тогда я не уверен, как получить доступ к использованию, если он не входит в сферу применения ClickCounter ... Я обновил свой вопрос с помощью редактирования, который, я считаю, вы пытались передать. Правильно ли, если да, то каким образом я могу обновить clickcounter после выбора Yes? – user3029953

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