2014-02-06 8 views
0

Мне интересно, можно ли использовать GroupBox как чисто эстетический объект. Проще говоря, у меня есть большой групповой ящик со множеством меньших групповых ящиков внутри него. У всех есть переключатели. Я хочу, чтобы пользователь мог активировать только один переключатель между ними.Поведение RadioButtons с вложенными GroupBoxes

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

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

Я использую Visual Studio 2010 Professional.

+1

К сожалению, для этого макета, вот как работают RB. Они будут работать таким образом с любым управлением контейнером (например, панель без рамки, чтобы вы не могли видеть контейнер). Вы можете подумать о правильном управлении RBS. Многие из 2 (Вкл./Выкл.) Могут быть заменены флажком. наборы из более чем 3 могут лучше использовать пространство с комбинированным ящиком. Вы также можете использовать многоэкранный список Listbox или checklistbox. – Plutonix

+0

К сожалению, я должен уважать способ создания пользовательского интерфейса. Я искал простое решение, я думаю, мне придется отключить все радиокнопки с помощью специального кода, кроме только что нажатого. – Pico

+1

похоже, что это ПЛОХОЙ интерфейс, если он использует групповые ящики в качестве украшений и распространяет RB, представляющие логическую группу в подгруппы. У вас будет сложность с кодом, потому что вам также придется бороться с естественным поведением, чтобы действовать так, как они должны. – Plutonix

ответ

1

Хорошо, хорошо, так как я не видел ни одного ответа не представляется я думал, что я ...

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

UPDATE: вы можете иметь вложенные групповые группы в групповом поле или иметь только групповые группы, и вы можете переключать это поведение, если хотите. , ,

Public Class TestRadioButtons 
Private blnIsGroupBoxInGroupBox As Boolean = False 

Private Sub Form2_Disposed(sender As Object, e As System.EventArgs) Handles Me.Disposed 
    RemoveHandlers() 
End Sub 


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

    blnIsGroupBoxInGroupBox = False 

    AddHandlers() 


    For Each ctrl As Control In Me.Controls 
     If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
      For Each rB As RadioButton In ctrl.Controls 
       rB.AutoCheck = True 
      Next 
     End If 
    Next 

    For Each ctrl As Control In Me.Controls 
     If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
      For Each rB As RadioButton In ctrl.Controls 
       rB.Checked = False 
      Next 
     End If 
    Next 

End Sub 


Private Sub PerformCheck(ByVal sender As Object, e As System.EventArgs) 

    Select Case blnIsGroupBoxInGroupBox 

     Case True 
      For Each cntl As Control In Me.Controls 
       If TypeOf (cntl) Is Windows.Forms.GroupBox Then 
        For Each con As Windows.Forms.GroupBox In cntl.Controls 
         For Each rB As RadioButton In con.Controls 
          If rB.Name.ToString = sender.name.ToString Then 
           If rB.Checked Then 
            For Each cont As Control In Me.Controls 
             If TypeOf (cont) Is Windows.Forms.GroupBox Then 
              For Each gBox As Windows.Forms.GroupBox In cont.Controls 
               For Each rButton As RadioButton In gBox.Controls 
                If Not rButton.Name.Equals(sender.Name.ToString) Then 
                 rButton.Checked = False 
                End If 
               Next 
              Next 
             End If 
            Next 
           End If 
          End If 
         Next 
        Next 
       End If 
      Next 
     Case Else 
      For Each ctrl As Control In Me.Controls 
       If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
        For Each rB As RadioButton In ctrl.Controls 
         If rB.Name = sender.Name.ToString Then 
          If rB.Checked Then 
           For Each con As Control In Me.Controls 
            If TypeOf (con) Is Windows.Forms.GroupBox Then 
             For Each rButton As RadioButton In con.Controls 
              If Not rButton.Name.Equals(sender.Name.ToString) Then 
               rButton.Checked = False 
              End If 
             Next 
            End If 
           Next 
          End If 
         End If 
        Next 
       End If 
      Next 
    End Select 

End Sub 

Private Sub AddHandlers() 

    Select Case blnIsGroupBoxInGroupBox 

     Case True 
      For Each ctrl As Control In Me.Controls 
       If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
        For Each con As Windows.Forms.GroupBox In ctrl.Controls 
         For Each rB As RadioButton In con.Controls 
          AddHandler rB.CheckedChanged, AddressOf PerformCheck 
         Next 
        Next 
       End If 
      Next 
     Case Else 
      For Each ctrl As Control In Me.Controls 
       If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
        For Each rB As RadioButton In ctrl.Controls 
         AddHandler rB.CheckedChanged, AddressOf PerformCheck 
        Next 
       End If 
      Next 

    End Select 

End Sub 

Private Sub RemoveHandlers() 
    If Me IsNot Nothing Then 
     Select Case blnIsGroupBoxInGroupBox 

      Case True 
       For Each ctrl As Control In Me.Controls 
        If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
         For Each con As Windows.Forms.GroupBox In ctrl.Controls 
          For Each rB As RadioButton In con.Controls 
           RemoveHandler rB.CheckedChanged, AddressOf PerformCheck 
          Next 
         Next 
        End If 
       Next 
      Case Else 
       For Each ctrl As Control In Me.Controls 
        If TypeOf (ctrl) Is Windows.Forms.GroupBox Then 
         For Each rB As RadioButton In ctrl.Controls 
          RemoveHandler rB.CheckedChanged, AddressOf PerformCheck 
         Next 
        End If 
       Next 

     End Select 
    End If 
End Sub 
End Class 
+0

См. UPDATE, теперь вы можете иметь групповые группы внутри группового или группового ящика, и это все еще работает; его все переключено с булевым. Я уверен, что вы найдете, что это здорово для того, чего вы хотите :) Дайте мне знать, как это работает для вас. ЭТО ПОЗВОЛИТ И ИСПЫТАНО ДЛЯ ОБЩИХ СЛУЧАЙ. – Codexer