【问题标题】:VB Adding an item to listbox on a different form giving null reference exceptionVB将项目添加到不同表单上的列表框,给出空引用异常
【发布时间】:2015-11-23 04:55:32
【问题描述】:

我在尝试以不同的形式将项目添加到列表框时收到 Null 引用异常。

这是我在运行时的错误。

“System.NullReferenceException”类型的未处理异常 发生在 ... 附加信息:对象引用未设置为 对象的实例。

我正在尝试通过在 secondForm 类的顶部对其进行初始化来连接 Mainform。获得数据后,我想将其添加到主窗体的列表框中。

Public Class FormHairdresser //The second form
     Dim varMainForm As FormMain //connecting the forms ?

Private Sub btnAddHairdresser_Click(sender As Object, e As EventArgs) Handles btnAddHairdresser.Click

hairdresser = HairdresserChoices(HairdresserID) // get the data
  varMainForm.lstListBox.Items.Add(hairdresser) //Run time error breaks here.

【问题讨论】:

    标签: vb.net forms listbox items


    【解决方案1】:

    我所要做的就是编写表单名称而不是初始化变量。

    FormMain.lstListbox.Items.Add("item")

    代替

    Dim varMainForm As FormMain varMainForm.ListBox.Items.Add("item")

    【讨论】:

      【解决方案2】:

      您不能简单地创建主窗体的新实例(正如所建议的并期望它能够正常工作,您需要对已创建的主窗体进行实际引用。为了帮助您了解所涉及的逻辑;

      创建一个新的 Winforms 项目。在默认的 Form1 中添加一个文本框和一个按钮。 现在向此应用程序添加一个新表单(您可以将其保留为默认名称 Form2。向此表单添加一个 TextBox(称为 myTextBox)和一个按钮。

      现在回到您的第一个表单并双击按钮以访问代码中的点击处理程序。添加以下内容:

      Dim frm as New Form2
      frm.Show
      

      按 f5 并单击按钮,您将看到一个新表单 2。到目前为止一切顺利。

      现在打开 Form2 的代码并添加以下代码,使其最终看起来像这样:

          Public Class Form2
      
          Private frm As Form1
      
          Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
              frm.TextBox1.Text = myTextBox.text
          End Sub
      
      End Class
      

      构建,按f5并单击form1上的按钮,在新的form2中在文本框中输入一些文本并单击按钮,您会得到空引用异常。你得到这个的原因是因为此时私有字段 frm inForm2 指的是 Nothing。

      现在打开 Form2 中的代码并添加一个构造函数和以下代码,使其最终看起来像这样:

        Public Class Form2
      
      
      
            Private frm As Form1
              Public Sub New(byval frm1 As Form1)
                  'first we should make sure that we have a parameter to play with
                  If Not IsNothing(frm1) Then
                      frm = DirectCast(frm1,Form1)
                  End If
              End Sub
      
      
      
              Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
                  frm.TextBox1.Text = myTextBox.text
              End Sub
      
          End Class
      

      最后回到你的第一个表单按钮点击处理程序并稍微更改代码,使其看起来像这样;

         Dim frm as New Form2(Me)
      
      frm.Show
      

      构建并运行您的应用程序,现在当您在 form2 的文本框中输入文本并单击按钮时,它将出现在 Form1 的文本框中。

      发生这种情况的原因是因为您传递了对 form1 的实际引用,该引用最初是在应用程序启动时创建的 form2。通过将该引用转换为用于在 form2 中表示 form1 的私有字段,您可以使用它来正确引用 form1 上的内容。这是一个非常简单的概念,但您需要先了解它,然后才能进行编程。

      【讨论】:

        【解决方案3】:

        问题在于您对 formmain 的初始化。如果没有正确初始化,您正在创建的对象只不过是Null。为避免这种情况,我们使用New 运算符。New 运算符通常可用于创建声明时的实例。 所以初始化看起来像

         Dim varMainForm As New FormMain 
        

        希望对您有所帮助。更多参考Object Initialization Errors

        更新:

         Dim varMainForm As FormMain //connecting the forms ?
        
        Private Sub btnAddHairdresser_Click(sender As Object, e As EventArgs) Handles                      btnAddHairdresser.Click
        
        hairdresser = HairdresserChoices(HairdresserID) // get the data
          varMainForm = New FormMain 
          varMainForm.lstListBox.Items.Add(hairdresser) //Run time error breaks here.
        

        【讨论】:

        • 现在不会崩溃,但不会向列表框添加任何内容
        • 做一件事将您的列表框添加为Public Shared成员..然后尝试..参考vbcity.com/forums/t/6364.aspx
        • 我在第二个表单的顶部添加了“Public Shared lstHairdresserandServices As System.Windows.Forms.ListBox”,主表单的列表框中仍然没有任何内容
        【解决方案4】:

        试试这个。

        Public Class FormHairdresser //The second form
        
                Private Sub btnAddHairdresser_Click(sender As Object, e As EventArgs) Handles btnAddHairdresser.Click
        
                Dim varMainForm As FormMain 
                hairdresser = HairdresserChoices(HairdresserID) 
                varMainForm.lstListBox.Items.Add(hairdresser) 
        

        【讨论】:

        • 我在“varMainForm”.listListBox.Items.Add(hairdresser) 下收到一个编译时错误,提示“在为其分配值之前使用了'varMainForm'。运行时可能导致空引用异常” )
        • 您的美发师是什么变量类型?这是一个列表?
        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2015-08-02
        • 2019-11-29
        • 2016-04-24
        • 1970-01-01
        相关资源
        最近更新 更多