Как создать событие для динамического массива управления в VB.NET - PullRequest
0 голосов
/ 17 ноября 2010

Я пытаюсь создать массив флажков динамически, а также хочу поставить событие в эти флажки.Как я могу это сделать?

Например:

У меня есть массив флажков - Chk1, Chk2.

Я хочу, чтобы это работало следующим образом: Когда я проверяю Chk1, Я хочу отключить Chk2, и когда Chk1 снят, Chk2 включен, и наоборот.

Ваш ввод с благодарностью.

Спасибо,

PS: Theкод находится в VB.NET.Спасибо.


Спасибо всем за вклад.Я действительно оценил это.Может быть, я не очень четко объяснил свое объяснение ранее.

Допустим, у меня есть массив из 6 флажков, и я хочу, чтобы они вели себя в группе следующим образом:

  • Когда проверяется Chk1, Chk2 отключается (серыйout), и когда мы снимаем флажок с Chk1, Chk2 включается и наоборот.

  • Когда проверяется Chk3, Chk4 отключается, а когда мы снимаем флажок с Chk3, Chk4 включается и наоборотВерсия.

и т. Д.

Таким образом, каждая пара флажков в массиве выполняет событие CheckChanged друг на друга, но не на любомдругая пара.Поэтому я думаю, что OptionButton не подходит для этой ситуации.

Спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2010

RadioButton сделает это автоматически и является более обычным. Для массива флажков вы можете использовать один обработчик для всего массива:

Private Sub _CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim i As Integer
If sender.checked Then
  For i = 0 To UBound(chk)
    If chk(i) IsNot sender Then chk(i).Checked = False
  Next i
End If
End Sub

Помните, что если вы вносите изменения в этот обработчик, он вызывается рекурсивно, когда вы устанавливаете chk (i) .checked в false В данном случае это не имеет значения, потому что пропускает все, когда sender.checked имеет значение false.

Если вам это нужно, вот один из способов настроить массив. (Свойство index в конструкторе исчезло при обновлении с vb6 до .net, поэтому теперь вам нужно создать массив элементов управления в коде.)

Public Class Form1
Dim chk(4) As CheckBox

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim i, k As Integer
k = 20
For i = 0 To UBound(chk)
  chk(i) = New CheckBox
  Me.Controls.Add(chk(i))
  chk(i).Location = New Point(20, k)
  k = k + chk(0).Height * 1.5 ' or some location
  chk(i).Text = "Checkbox " & i ' some appropriate text
  AddHandler chk(i).CheckedChanged, AddressOf _CheckedChanged
Next i

End Sub
0 голосов
/ 17 ноября 2010

Предполагая, что это ASP.Net, посмотрите на этот "странный" пример, чтобы увидеть, как он работает (возьмите ваш массив вместо моего статического создания):

Private Sub WebForm1_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
    For number As Int32 = 1 To 100
        Dim chk As New CheckBox
        chk.ID = "chk" & number
        chk.Text = chk.ID
        chk.AutoPostBack = True
        AddHandler chk.CheckedChanged, AddressOf onCheckedChanged
        Me.MyChkPanel.Controls.Add(chk)
    Next
End Sub

Private Sub onCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    Dim chk As CheckBox = DirectCast(sender, CheckBox)
    Dim number As Int32 = Int32.Parse(chk.ID.Substring("chk".Length))
    Dim otherChk As CheckBox
    If number Mod 2 = 0 Then
        otherChk = DirectCast(Me.MyChkPanel.FindControl("chk" & (number - 1)), CheckBox)
    Else
        otherChk = DirectCast(Me.MyChkPanel.FindControl("chk" & (number + 1)), CheckBox)
    End If
    otherChk.Enabled = Not chk.Checked
End Sub

Помимо этого я могуподписаться на предложение Ганса использовать RadioButton или хотя бы CheckBoxList .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...