vb.net在用户控件上调用子例程

时间:2009-05-30 18:49:25

标签: vb.net user-controls

我在一个拆分容器中有一个panel2,它有几个用户控件加载到它中。面板1有一个退出按钮,我想调用加载到Panel2中的一个用户控件中的一个子例程。

Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click
        Dim dialogMessage As DialogResult
        Dim a As New ucTimeTracker

    dialogMessage = MessageBox.Show("Are you sure you want to exit?", "Exit Ready Office Assistant?", _
    MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)

    If dialogMessage = Windows.Forms.DialogResult.Yes Then

        ucTimeTracker.autoWriteFileOnExit()
        Me.Close()

    Else
        Return
    End If

End Sub

这条线给我带来麻烦。

ucTimeTracker.autoWriteFileOnExit()

我收到了(引用非共享成员需要一个对象引用)。​​

我希望frmMain.SplitContainer.Panel1上的退出按钮在名为ucTimeTracker的用户控件上调用autoWriteFileOnExit(),该控件被加载到splitContainer.Panel2

2 个答案:

答案 0 :(得分:1)

您似乎正在使用用户控件类名ucTimeTracker而不是实例名称。在设计视图中单击用户控件,在属性视图中,有一个“名称”属性。请使用name属性中的值(可能是ucTimeTracker1):

  ucTimeTracker1.autoWriteFileOnExit()

答案 1 :(得分:0)

您正在使用ucTimeTracker来引用该方法,该方法是类的名称。在该方法的前面,您创建了该类的实例(Dim a As New ucTimeTracker),因此您应该调用a. autoWriteFileOnExit(),如果这是您要使用的实例。如果ucTimeTracker是表单上的控件,则应该使用该控件的名称。

要理解这一点,您需要了解 static 成员和实例成员之间的区别。可以通过类直接访问静态成员,而无需创建类的实例。要使用实例成员,首先需要该类的实例。您可以查看Int32类作为示例:

' call a static method in the Int32 class, that returns an Int32 instance'
Dim asInt As Int32 = Int32.Parse("14") 
' call an instance method on the Int32 instance, that will act on the data in '
' that instance, returning a string representation of its value '
Dim asString As String = asInt.ToString()

通常,静态方法不会对类中保存的数据起作用(尽管并非总是如此),而是作用于通过参数传递给方法的数据。实例方法可以访问该特定实例的内部数据,并可以对该数据进行操作(如上例所示)。