检查表单1中form2的共享值时检查错误

时间:2013-10-06 12:21:42

标签: vb.net winforms parent-child

我在form1.heres形式1代码

的datagrid的按键上显示form2
 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中的searchbox的值,如果有任何值,但是在form2中它在此行上给出错误

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错误..我很困惑我在这里做错了... as 我正在检查是否有值,然后执行代码。

1 个答案:

答案 0 :(得分:2)

此行正在抛出NullReferenceException

If IsNothing(frmgrn.searchbox.Text) Then

因为此变量为null

frmgrn

您没有在代码中的任何位置初始化该变量。 (至少在您向我们展示的代码中没有。)我将根据其使用情况假设frmgrnForm2中的类级变量。像这样:

Private frmgrn as Form1

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

但是,除了初始化之外,在这种情况下,您不仅需要初始化它,而且还需要它具体引用已加载的Form1实例。一种简单的方法是Form1在创建Form2实例时将自身的引用传递给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的实际实例,而不仅仅是空引用。