none
自定元件問題與Radio相關 RRS feed

  • 問題

  •  

    自定元件是組合 Button + Radio +TextBox

     

    使用方式為在某個 FlowLayoutPanel 或 TableLayoutPanel,加入數個自定元件

     

    問題:通常同個Panel中的Radio會互斥,但是使用自定元件卻不會,想請問是否少設定了什麼?

    2009年1月20日 上午 11:52

解答

  • 一般情況下
    只要把RadioButton放在容器內
    在同一容器內的RadioButton自動會互斥

    你會發生這個情況
    也許是因為你RadioButton的容器是你的UserControl
    因此每個UserControl內的RadioButton並不會互斥

    我是沒碰過這類的需求
    不過你可以考慮一下如下的做法

    Code Snippet

    Public Class UserControl1

     Private Shared _pool As New Hashtable

        Private Sub RadioButton1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
            For Each r As RadioButton In GetRadioButtonList(Me.Parent)
                If r Is sender Then
                    Continue For
                End If
                r.Checked = Not CType(sender, RadioButton).Checked
            Next
        End Sub

        Private Sub UserControl1_ParentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ParentChanged
            If _pool.Contains(Me.Parent) Then
                GetRadioButtonList(Me.Parent).Add(Me.RadioButton1)
            Else
                Dim a As New ArrayList
                a.Add(Me.RadioButton1)
                _pool.Add(Me.Parent, a)
            End If
        End Sub

        Private Function GetRadioButtonList(ByVal key As Object) As ArrayList
            Return CType(_pool(key), ArrayList)
        End Function
    End Class

       

    2009年1月21日 上午 03:16

所有回覆

  • 一般情況下
    只要把RadioButton放在容器內
    在同一容器內的RadioButton自動會互斥

    你會發生這個情況
    也許是因為你RadioButton的容器是你的UserControl
    因此每個UserControl內的RadioButton並不會互斥

    我是沒碰過這類的需求
    不過你可以考慮一下如下的做法

    Code Snippet

    Public Class UserControl1

     Private Shared _pool As New Hashtable

        Private Sub RadioButton1_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
            For Each r As RadioButton In GetRadioButtonList(Me.Parent)
                If r Is sender Then
                    Continue For
                End If
                r.Checked = Not CType(sender, RadioButton).Checked
            Next
        End Sub

        Private Sub UserControl1_ParentChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.ParentChanged
            If _pool.Contains(Me.Parent) Then
                GetRadioButtonList(Me.Parent).Add(Me.RadioButton1)
            Else
                Dim a As New ArrayList
                a.Add(Me.RadioButton1)
                _pool.Add(Me.Parent, a)
            End If
        End Sub

        Private Function GetRadioButtonList(ByVal key As Object) As ArrayList
            Return CType(_pool(key), ArrayList)
        End Function
    End Class

       

    2009年1月21日 上午 03:16
  • 謝謝樓上的回應,給我點靈感,我採用Controls + Delegate 完成互斥

     

    2009年1月21日 下午 02:50