0

我在form1中的datagrid的按键上显示form2。这里是form 1代码

 Public Shared searchbox As TextBox
Private Sub datagridItems_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles datagridItems.KeyPress
        If e.KeyChar = Microsoft.VisualBasic.ChrW(Keys.Enter) Then
            If datagridItems.CurrentCell.ColumnIndex = 0 Then
                searchbox = datagridItems.CurrentCell.Value
                frmitemsearch.ShowDialog()

            End If
        End If
    End Sub

我正在检查表单 2 中搜索框的值是否有任何值,但在表单 2 中它在此行给出错误

Private Sub item_search_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Dim searchstr As String
If IsNothing(frmgrn.searchbox.Text) Then

            searchstr = ""
        Else
            searchstr = frmgrn.searchbox.Text
        End If
is nothing fails also I tried this 
If String.IsNullOrEmpty(frmgrn.searchbox.text) Then

..它仍然抛出nullexception错误..我对我在这里做错了什么感到困惑......因为我正在检查是否有值然后执行代码。

4

1 回答 1

2

这条线抛出一个NullReferenceException

If IsNothing(frmgrn.searchbox.Text) Then

因为这个变量是null

frmgrn

您没有在代码中的任何地方初始化该变量。(至少在您向我们展示的代码中没有。)根据它的用途,我暂时假设它frmgrnForm2. 像这样的东西:

Private frmgrn as Form1

这不会初始化变量。它只是创建一个引用来保存它。

但是,除了初始化它之外,在这种情况下,您不仅需要初始化它,还需要它专门引用Form1已加载的实例。一个简单的方法是Form1Form2它创建一个Form2. 您在这里引用该实例:

frmitemsearch.ShowDialog()

但是请注意,您还没有展示如何frmitemsearch初始化。我假设它是这样的:

Dim frmitemsearch as New Form2()

在这种情况下,您可以创建一个新的构造函数,Form2该构造函数接受对以下实例的引用Form1

Public Sub New(ByVal form1 As Form1)
    frmgrn = form1
End Sub

frmgrn这将在创建实例时初始化(假定的)类级成员( ) Form2,将其设置为传递给构造函数的任何内容。所以你会像这样调用新的构造函数:

Dim frmitemsearch as New Form2(Me)

此时,当您创建 的实例时Form2,您将为其提供一个现有的Form1. 它将该实例存储在类级变量中。然后任何时候你有这样的代码Form2

If IsNothing(frmgrn.searchbox.Text) Then

您将引用一个实际实例,frmgrn而不仅仅是一个空引用。

于 2013-10-06T12:59:09.190 回答