1

そこで、最近、Visual Basic プログラミングでクラスを使用するという概念を理解しました。これが非常に役立つことがわかりました。私の現在のプロジェクトでは、チェックボックスのグループボックスがいくつかあり (各チェックボックスは「動作」を示します)、各グループボックスには、ラベルの代わりにテキストボックスコントロールを持つチェックボックスが常に 1 つあります(ユーザーが「その他」の動作を指定します)。問題を引き起こしているのは、そのユーザー生成ラベルです...

基本的に次のことを行う「Behaviors」というクラスを作成しました。

  1. getChecked > このメソッドは、チェックされている各チェックボックスを取得し、特定の Form の BehaviorCollection に追加します。
  2. behaviorCollection > は、チェックされたチェックボックスのコレクションを表します。
  3. getOtherChecked > は、「その他の動作」チェックボックスを除いて、「getChecked」と同じことを行います。
  4. otherBehaviorCollection > は、チェックされた「その他」チェックボックスのコレクションを表します。

問題は、チェックされた「その他の動作」チェックボックスごとに、対応するテキストボックスの値を保存する必要があることです。これを行うように getOtherChecked() メソッドを設定したいので、最終的にはこのようなことができるようになります...

Dim myBoxes as new Behaviors
Dim cBox as Checkbox
Dim cBoxLabel as String

myBoxes.getOtherChecked(myUserForm) 'This would get each checked "Other Behaviors" checkbox object, and also somehow add another property to it called "LinkedTextboxLabel" that would be assigned the value of the corresponding textbox.
cBox = myBoxes.otherBehaviorCollection.item(0) 'Assign a checkbox from my "Other Behaviors" collection to a variable.
cBoxLabel = cBox.LinkedTextboxLabel 'Assign the user-inputted value of the linked textbox to a variable.

基本的に、コレクション項目またはチェックボックスにカスタムプロパティを追加するにはどうすればよいですか?

コントロールの名前を一時的なDataTableまたはSQLテーブルに追加するだけで、各行の1つの列にチェックボックスの名前があり、次の列に対応するテキストボックスの値があることを考えましたが、より一般的にあることを望んでいます使用され、受け入れられた方法。

前もって感謝します!

4

3 に答える 3

1

「その他の動作」チェックボックスに関連付けられたテキストのプロパティを追加できます。

編集:「その他の動作」は特殊なケースであり、別の考慮に値するため、データを一般化しすぎている可能性があります。

(新しい Windows フォーム プロジェクトで) 次のコードが作成するものを見れば、アイデアが得られるかもしれません。

Public Class Form1

    ''' <summary>
    ''' A behaviour domain and its characteristics, with one user-defined entry.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class BehavioursSectionDescriptor
        Property BehaviourTypeName As String
        Property BehaviourNames As List(Of String)
        Property CustomBehaviours As String
    End Class

    ''' <summary>
    ''' Return a GroupBox containing CheckBoxes and one Checkbox with a TextBox adjacent to it.
    ''' </summary>
    ''' <param name="behaviourSet"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetBehaviourGroupPanel(behaviourSet As BehavioursSectionDescriptor) As GroupBox

        Dim gb As New GroupBox
        gb.Text = behaviourSet.BehaviourTypeName

        Dim fixedBehaviourNames As List(Of String) = behaviourSet.BehaviourNames
        Dim customBehavioursValue As String = behaviourSet.CustomBehaviours

        Dim cbVertSeparation As Integer = 4
        Dim gbPadding As Integer = 20

        Dim cb As New CheckBox

        Dim yLoc As Integer = gbPadding

        For i = 0 To fixedBehaviourNames.Count - 1
            cb = New CheckBox
            cb.Location = New Point(gbPadding, yLoc)
            cb.Text = fixedBehaviourNames(i)
            ' you can use the .Tag Object of a Control to store information
            cb.Tag = behaviourSet.BehaviourTypeName & "-Cb-" & i.ToString()
            gb.Controls.Add(cb)
            yLoc += cb.Height + cbVertSeparation

        Next

        cb = New CheckBox
        cb.Text = ""
        cb.Location = New Point(gbPadding, yLoc)
        cb.Tag = behaviourSet.BehaviourTypeName & "-Custom behaviours"
        gb.Controls.Add(cb)

        Dim tb As New TextBox
        tb.Location = New Point(gbPadding + 18, yLoc)
        tb.Width = 100
        tb.Text = customBehavioursValue
        gb.Controls.Add(tb)
        ' make sure the textbox appears in front of the checkbox's label area
        tb.BringToFront()

        gb.Size = New Size(160, yLoc + gbPadding * 2)

        Return gb

    End Function

    Private Function GetTestData() As List(Of BehavioursSectionDescriptor)
        Dim bsds = New List(Of BehavioursSectionDescriptor)
        bsds.Add(New BehavioursSectionDescriptor With {.BehaviourTypeName = "In water", _
                                                     .BehaviourNames = New List(Of String) From {"Floats", "Spins"}, _
                                                     .CustomBehaviours = "Paddles"})

        bsds.Add(New BehavioursSectionDescriptor With {.BehaviourTypeName = "Under light", _
                                                     .BehaviourNames = New List(Of String) From {"Shines", "Glows", "Reflects"}, _
                                                     .CustomBehaviours = "Iridesces"})

        bsds.Add(New BehavioursSectionDescriptor With {.BehaviourTypeName = "Near food", _
                                                     .BehaviourNames = New List(Of String) From {"Sniffs", "Looks"}, _
                                                     .CustomBehaviours = ""})

        Return bsds

    End Function

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

        Dim bsds As List(Of BehavioursSectionDescriptor) = GetTestData()

        Dim gbs As New List(Of GroupBox)
        Dim xLoc As Integer = 20
        Dim yLoc As Integer = 20

        ' make some GroupBoxes to present the data input fields
        For i = 0 To bsds.Count - 1
            Dim gb = GetBehaviourGroupPanel(bsds(i))
            gb.Location = New Point(xLoc, yLoc)
            gb.Dock = DockStyle.None
            yLoc += gb.Height + 30
            Me.Controls.Add(gb)
        Next

        ' size the form to fit the content
        Me.Size = New Size(240, yLoc + 40)

    End Sub


End Class
于 2013-04-11T19:16:48.610 に答える
0

データを DataTable や SQL テーブルなどに保存しようとしている場合、コードは少しやり過ぎになります。ストリーム リーダー/ライターを使用して値をチェックすることをお勧めします。これは、コードがはるかに単純になるためです。

于 2013-04-11T18:25:38.773 に答える