2010-11-16 42 views
0

我試圖動態創建複選框的數組,也希望把事件的複選框創建動態控件數組事件。我怎樣才能做到這一點?如何在VB.NET

例如:

我有複選框的陣列 - 的Chk1,Chk2的。

我希望它的工作是這樣的:當我檢查Chk1的,我想禁用CHK2,當Chk1的未選中,CHK2是啓用,反之亦然。

你輸入greately讚賞。

謝謝,

P.S .:代碼是在VB.NET中。謝謝。


謝謝大家的意見。我真的很感激它。也許我之前對我的解釋並不十分清楚。

比方說,我有6個複選框數組,我希望他們在組這樣的表現:

  • 當Chk1的檢查,CHK2被禁用(變灰),而當我們取消Chk1,Chk2啓用,並且副Versa。

  • 當Chk3被選中,Chk4被禁用,當我們取消Chk3,Chk4啓用,反之亦然。

等....

所以這就像每一對陣列中的複選框執行在彼此之上的CheckChanged事件,但不能在任何其它對。所以我認爲在這種情況下,OptionButton並非如此。

感謝您的任何建議。

+0

什麼是到目前爲止你已經嘗試過什麼?你具體問題在哪裏?一系列複選框意味着什麼,有多少,動態創建或靜態,它們如何鏈接在一起?你的意思是ASP.Net或Winforms? – 2010-11-16 21:53:37

+0

你應該評論我們迄今爲止嘗試過的答案,以及你遇到問題的地方。我只能談論我的答案,這應該完全按照你的想法工作。我通過它們的ID來識別對(chk1屬於chk2,chk3到chk4等等)。看看:http://stackoverflow.com/questions/4199370/how-to-create-event-for-dynamic-control-array-in-vb-net/4199611#4199611 順便說一句,不要忘記upvote至少有用的答案(向上箭頭)或/並將最佳答案標記爲答案(檢查)。 – 2010-11-17 12:11:23

回答

0

假設它是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 

除此之外,我可以訂閱Hans建議使用RadioButtons或至少一個CheckBoxList

+0

你是個天才,蒂姆!它按預期工作。非常感謝! – 2010-11-17 14:52:07

0

一個單選按鈕會自動做到這一點,是比較傳統的。對於複選框的數組,你可以使用一個處理程序,整個數組:

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假。這種情況並不重要,因爲它在sender.checked爲false時會跳過所有內容。

在您需要的情況下,這裏是設置陣列的一種方式。 (在設計該指數財產從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