我可以创建属性的属性吗?

时间:2013-04-11 16:34:50

标签: vb.net class methods properties visual-studio-2012

所以我最近掌握了在Visual Basic编程中使用类的概念,我发现它非常有用。在我当前的项目中,我有几组复选框(每个复选框表示“行为”),在每个组框中,总有一个复选框具有文本框控件而不是标签(允许用户指定“其他”行为)。这是用户生成的标签给我带来的麻烦......

我创建了一个名为“行为”的类,它基本上执行以下操作:

  1. getChecked>此方法获取每个选中的复选框并将其添加到 给定表单的BehaviorCollection。
  2. behaviorCollection>代表已检查的集合 复选框。
  3. getOtherChecked>与“getChecked”相同,除了 “其他行为”复选框。
  4. otherBehaviorCollection>代表已检查的集合 “其他”复选框。
  5. 问题是,对于每个选中的“其他行为”复选框,我需要存储其相应文本框的值。我想设置我的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表中,这样每行在一列中都会有一个复选框的名称,而在下一行中会有相应的文本框值,但我希望有一种更常用和被接受的方法。

    提前谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我知道它没有回答向属性添加属性的问题,但是你可以为Other复选框创建一个类并覆盖它的功能吗?然后你可以添加复选框和OtherCheckBoxes到您的通用集合?例如,(绝不是完整的,但你应该明白这一点)

编辑:更改代码以显示阴影

Public Class OptionalCheckbox : Inherits CheckBox
Private mOptionalText As String

Public Shadows Property Text() As String
    Get
        Return mOptionalText
    End Get
    Set(value As String)
        mOptionalText = value
        MyBase.Text = value
    End Set
End Property
End Class

对于每个项目,如果您要检索.Text,您将获得文本框值或复选框标签(如果它是正常的复选框)

如何在代码的其他部分使用。同样,这只是一个例子。您仍然需要使用分配给OtherCheckBox的文本框来使其将文本写入该文本框,并将其读取到类的.Text属性中。

    Dim newCheckBoxCollection As New Collection

    Dim cBox As New CheckBox
    cBox.Text = "Standard Value Here"
    'other properties of the checkbox can be modified here
    newCheckBoxCollection.Add(cBox)

    Dim cOBox As New OptionalCheckbox
    cOBox.Text = "Optional Text Here"
    'other properties of the checkbox can be modified here
    newCheckBoxCollection.Add(cOBox)

    For Each cb As CheckBox In newCheckBoxCollection
        Me.FlowLayoutPanel1.Controls.Add(cb)
    Next

答案 2 :(得分:0)

如果您尝试将数据保存为类似DataTable或SQL表的内容,则代码可能会有点过分。我建议你使用一个流读取器/写入器,并尝试检查这些值,因为代码会更简单。