2017-04-13 11 views
0

私たちは学校でプロジェクトを行い、私のプログラムではパネル内に2つのラジオボタン(yes/no)があり、それらのパネルはグループボックス内にあります。どのようにして別のラジオボタンから値を取得できますか?私はTrue/False値を得ることを見ているだけです。これは、ユーザーが持っているかしていないと言うことができるはずのいくつかの健康問題の簡略化されたリストのようなもので、これはデータベースに送られます。グループボックス内のパネルのラジオボタンのチェック値を取得

すべてのチェックボックスをループし、各結果をStringに追加してからそのStringを返そうとしましたが、絶対に何も返しません。エラーメッセージもありません!私はフォーム内の両方のラジオボタンをループし、両方のif文をチェックするという事実と関係があるかもしれないという疑いがありますが、それ以外の方法はわかりません。すべてのパネルには2つのラジオボタンがあり、それ以上のものはありません。インデックスで見つけることは可能でしょうか?

レイアウトは、わずか2 Oのは、チェックボックスを表し、この

+----------------+ 
| Y N   | 
|+-----+   | 
|| o o|   | 
||Panel|   | 
|+-----+   | 
|Groupbox  | 
+----------------+ 

ようなものである(Y/Nは、はい/いいえ表します)。

これは、私はすべてをループするために使用codeです:私は本当にこだわっています、とまったく助けをいただければ幸いです

Imports MySql.Data.MySqlClient 

Public Class Egenerklaring 
    ' The list of booleans that is supposed to be formatted correctly and sent to the database 
    Private verdier As List(Of Boolean) = New List(Of Boolean) 
    ' A counter of how many checkboxes which is not checked at all 
    Private ikkeUtfylt As Integer 

    Private Function skrivUtListe() 
     Dim temp As List(Of String) = New List(Of String) 
     For Each a As Boolean In verdier 
      temp.Add(a.ToString) 
     Next 
     Return String.Join(",", temp) 
    End Function 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Dim i As Integer = 0 
     For Each a As Control In Me.Controls 
      If TypeOf a Is GroupBox Then 
       For Each b As Control In a.Controls 
        If TypeOf b Is Panel Then 
         For Each c As Control In b.Controls 
          If TypeOf c Is CheckBox Then 
           ' If checkbox name contains ja/yes 
           If c.Name.Contains("ja") AndAlso DirectCast(c, CheckBox).Checked Then 
            verdier(i) = True 
            ' If checkbox name contains nei/no 
           ElseIf c.Name.Contains("nei") AndAlso DirectCast(c, CheckBox).Checked Then 
            verdier(i) = False 
           Else 
            ikkeUtfylt += 1 
           End If 
          End If 
          i += 1 
         Next 
        End If 
       Next 
      End If 
     Next 

     If ikkeUtfylt > 0 Then 
      MsgBox("Fyll ut alle boksene!") 
     Else 
      MsgBox(Me.skrivUtListe()) 
     End If 

    End Sub 

End Class 

+0

あなたがしようとしていることはまったく明確ではありません。まず、 'RadionButton'コントロールを使用しているが、' CheckBox'コントロールを使用していると言うことで始まります。あなたのコードから、私は 'CheckBox'を見ることができますが、問題の内容が正確ではありません。 'verdier.Add(True)'と 'verdier.False(False)'を試してみてください。また、私はあなたが適応しなければならないmy [answer](http://stackoverflow.com/a/43319283/6375113)のような再帰的な方法を検討する価値があります。これにより、各コンテナコントロールを下げる必要がなくなります。 – Bugs

+0

ああ、申し訳ありません。その後、何も返さないというのは理にかなっています。私はCheckBoxとRadioButtonを混ぜています。 – gloriousCatnip

+0

ここにいくつかの更新されたコードがあります:https://gist.github.com/wOstensen/552c42f8ed18194387cf1b6599d3c6dd – gloriousCatnip

答えて

0

は、あなたがその名前を知っていれば、それは形をしているところはどこでもを返しますRadioButton2.Checked。 your'eが、それは単に、名前を知っていることになっていない場合:

Dim RadioChecked as boolean 
For Each gb As Control In Me.Controls 
    If TypeOf gb Is GroupBox Then 
     For Each tb As Control In gb.Controls 
      If TypeOf tb Is Panel Then 
       For Each ctr As Control In tb.Controls 
        If TypeOf ctr Is RadioButton Then 
         RadioChecked = ctr.Checked 
        EndIF 
       Next 
      End If 
     Next 
    End If 
Next 
0

あなたRadioButtonsの値を取得する最も簡単な方法は、再帰的なメソッドを使用することです:

Private verdier As List(Of Boolean) = New List(Of Boolean) 

Private Sub GetRadionButtonCheckStatus(ByVal parent As Control) 

    For Each c As Control In parent.Controls 
     If TypeOf (c) Is Panel Then 
      For Each rb As RadioButton In c.Controls.OfType(Of RadioButton)() 
       verdier.Add(rb.Checked) 
      Next 
     Else 
      If c.HasChildren Then 
       GetRadionButtonCheckStatus(c) 
      End If 
     End If 
    Next 

End Sub 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 

    verdier.Clear() 

    GetRadionButtonCheckStatus(Me) 

    'Used for debugging 
    For Each value In verdier 
     Debug.WriteLine(String.Format("Value: {0}", value.ToString())) 
    Next 

End Sub 

出力が同様なものになりますこれに:

Value: True 
Value: False 

あなたは、この上で拡張し、Dictionary(Of String, Boolean)を使用して、正しく識別できるようRadioButton.Nameプロパティを収集する必要があるかもしれませんあなたの出力は次のようになり、このコードを使用して

Private verdier As Dictionary(Of String, Boolean) = New Dictionary(Of String, Boolean) 

Private Sub GetRadionButtonCheckStatus(ByVal parent As Control) 

    For Each c As Control In parent.Controls 
     If TypeOf (c) Is Panel Then 
      For Each rb As RadioButton In c.Controls.OfType(Of RadioButton)() 
       verdier.Add(rb.Name, rb.Checked) 
      Next 
     Else 
      If c.HasChildren Then 
       GetRadionButtonCheckStatus(c) 
      End If 
     End If 
    Next 

End Sub 

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 

    verdier.Clear() 

    GetRadionButtonCheckStatus(Me) 

    'Used for debugging 
    For Each kvp In verdier 
     Debug.WriteLine(String.Format("Key: {0} Value: {1}", kvp.Key, kvp.Value)) 
    Next 

End Sub 

:各RadionButtonの状態をentify

Key: RadioButton1 Value: True 
Key: RadioButton2 Value: False 
+0

申し訳ありませんが、私はしばらく応答していない、プロジェクトなどで作業しています。私はうまくいくと思った解決策を見つけました。 すべてのパネルに正確に2つのラジオボタンがあるので、私は Jaラジオの場合は 'Panel.Controls(0)'、Neiの場合は1つのことができるはずです。 これは私のコードです:https://gist.github.com/wOstensen/4111ba0d7bf31d342d30b2632e1f421 これはチェックされていないかどうかをチェックするために機能しますが、正しい結果を返しません。ここで私が選んだものとその結果を示すイメージがあります:http://imgur.com/a/J4s8d なぜほとんどすべてが偽ですか? – gloriousCatnip

0

がどのようにネストされた中に関係なく、フォーム上のすべてのコントロールを取得していないために拡張メソッドを使用します容器です。そして、結果は "JA"/"ネイ" なしのRadioButtonの名前が含まれていることをLINQ

Public Class Form1 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim rbs = Me.ChildControls(Of RadioButton)() 
     Dim groups = rbs.GroupBy(Of String)(Function(rb) rb.Name.Replace("ja", "").Replace("nei", "")) 
     If groups.Select(Function(g) g.Sum(Function(i) If(i.Checked, 1, 0))).Sum() <> groups.Count Then 
      MessageBox.Show("Fyll ut alle boksene!") 
     Else 
      Dim result = 
       groups. 
       Select(
        Function(g) 
        Return g.First().Name.Replace("ja", "").Replace("nei", "") & 
         "=" & g.Where(Function(i) i.Name.Contains("ja")).First().Checked 
       End Function) 
      MessageBox.Show(String.Join(", ", result)) 
     End If 

    End Sub 

End Class 

Module code 

    <System.Runtime.CompilerServices.Extension()> 
    Public Function ChildControls(Of T As Control)(ByVal parent As Control) As List(Of T) 
     Dim result As New List(Of T) 
     For Each ctrl As Control In parent.Controls 
      If TypeOf ctrl Is T Then result.Add(CType(ctrl, T)) 
      result.AddRange(ctrl.ChildControls(Of T)()) 
     Next 
     Return result 
    End Function 

End Module 

enter image description here

お知らせを使用しています。代わりに、パラメータ名(データベース列?)をRadioButtonのTagプロパティに代入して返すこともできますし、 "jaParameter1"、 "neiParameter1"などのRadioButton名を作成することもできます。

関連する問題