如何从动态添加的对象访问数据

时间:2015-04-30 10:22:01

标签: visual-studio-2013 basic

第一次访问这个网站,我的时间有点短...... 所以,它可能比我找不到的东西那么容易....

我使用一个按钮来显示几个文本框和其他控件,并为它们提供一个对象的数据。

我在最后有一个ok按钮和一个事件处理程序,我想将控件中的新数据传回到对象中。

这是我使用的代码:

        Dim txtTitleM As New TextBox
        txtTitleM.AutoSize = True
        txtTitleM.Text = task.title
        pnlTask.Controls.Add(txtTitleM)
        indexY = txtTitleM.Size.Height + 10

        Dim txtDescriptionM As New TextBox
        With txtDescriptionM
            .AutoSize = True
            .Location = New Point(0, indexY)
            .Text = task.description
        End With
        pnlTask.Controls.Add(txtDescriptionM)
        indexY = indexY + txtDescriptionM.Size.Height + 10

        Dim cboCategoryM As New ComboBox
        Dim Item As Object
        For Each Item In cboCategory.Items
            With cboCategoryM.Items
                .Add(Item)
            End With
        Next

        With cboCategoryM
            .AutoSize = True
            .Location = New Point(0, indexY)
            .SelectedIndex = task.category
        End With
        pnlTask.Controls.Add(cboCategoryM)
        indexY = indexY + cboCategoryM.Size.Height + 10

        Dim chkDeadLine As New CheckBox
        With chkDeadLine
            .AutoSize = True
            .Location = New Point(0, indexY)
            .Text = "DeadLine"
            .Checked = task.deadline <> Nothing
        End With
        pnlTask.Controls.Add(chkDeadLine)
        indexY = indexY + chkDeadLine.Size.Height + 10

        If chkDeadLine.Checked Then
            Dim dtpDate As New DateTimePicker
            With dtpDate
                .AutoSize = True
                .Location = New Point(0, indexY)
                .Value = task.deadline.Date
            End With
            pnlTask.Controls.Add(dtpDate)
            indexY = indexY + dtpDate.Size.Height + 10
        End If

        Dim pnlBtnMod As New Panel
        pnlBtnMod.AutoSize = True
        'pnlBtnMod.Location = New Point(0, indexY + 10)
        pnlBtnMod.Dock = DockStyle.Bottom
        grpTask.Controls.Add(pnlBtnMod)

        Dim btnOkMod As New Button
        btnOkMod.Text = "Ok"
        'btnOkMod.AutoSize = True
        'btnOkMod.AutoSizeMode = Windows.Forms.AutoSizeMode.GrowAndShrink
        pnlBtnMod.Controls.Add(btnOkMod)
        btnOkMod.Location = New Point(10, 0)
        AddHandler btnOkMod.Click, AddressOf clickOkModTask

和hendler:

Private Sub clickOkModTask(sender As Object, e As EventArgs)
        Dim task As Task = findTask(sender)
        If Not task Is Nothing Then
            With task
                .title = txtTitleM.text
                .description = txtDescriptionM.text
                '.category = 
                '.deadline 
            End With
        End If
    End Sub

我知道findTask(发送者)不起作用我有txtTitleM声明或动态添加任何其他控件的麻烦。我不能把“公共Dim文本框作为新的文本框”......所以我不知道我能用什么......

感谢您的时间,感谢您的回复。

1 个答案:

答案 0 :(得分:0)

所以:

  1. findTask将返回pnlBtnMod,因为btnOkMod不属于Controls grpTask Controls pnlBtnMod pnlBtnMod }}

    • 您必须在grpTask再次调用它才能获得grpTask,因为这是按钮和文本框之间的根
  2. 现在你得到grpTask但是Controls的任务数组不包含你的TextBox。

    • pnlBtnMod包含2个面板(pnlTasktask.Controls(1) as Panel
    • 从控件(Name
    • 获取第二个面板
  3. 现在你有了TextBox-s的面板

    • 使用索引或为TextBox提供名称(设置Tag属性)以查找它们。
  4. 添加一个难看的解决方案:

    • btnOkModdisplayTask的{​​{1}}属性设置为这些TextBox或TextBoxes数组
    • 直接在eventhandler中获取这些TextBox / TextBox