/ / null sprawdzający błąd podczas sprawdzania wartości wspólnej z formularza 2 w formularzu 1 - vb.net, winforms, parent-child

zerowy błąd sprawdzania podczas sprawdzania wartości wspólnej z formularza 2 w formularzu 1 - vb.net, winforms, parent-child

Wyświetlam form2 na keypress datagrid w formularzu1. Jest to kod formularza 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

Sprawdzam wartość pola wyszukiwania w formularzu 2, jeśli istnieje jakakolwiek wartość lub nie, ale w formularzu 2 to daje błąd w tym wierszu

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

..jeśli wyrzuca błąd nullexception ... jestem zdezorientowany tym, co robię źle tutaj ... jak Sprawdzam, czy tam wartość, czy nie, a następnie wykonaj kod.

Odpowiedzi:

2 dla odpowiedzi № 1

Ta linia rzuca a NullReferenceException:

If IsNothing(frmgrn.searchbox.Text) Then

Ponieważ ta zmienna jest null:

frmgrn

Nie zainicjalizujesz tej zmiennej nigdzie w swoim kodzie. (Przynajmniej nie w kodzie, który nam pokazałeś.) Zamierzam założyć na chwilę, na podstawie jego użycia, że frmgrn jest zmienną na poziomie klasy w Form2. Coś takiego:

Private frmgrn as Form1

To nie inicjuje zmiennej, a jedynie tworzy odwołanie do jej zatrzymania.

Jednak poza inicjowaniem, w tym przypadku musisz go nie tylko zainicjować, ale potrzebujesz go konkretnie odwołaj się do instancji Form1 to jest już załadowane. Łatwy sposób to zrobić Form1 przekazać sobie referencję Form2 kiedy tworzy instancję Form2. Tutaj odwołujesz się do tej instancji:

frmitemsearch.ShowDialog()

Zauważ jednak, że również nie pokazałeś jak frmitemsearch zostanie zainicjowany. Założę się, że to coś takiego:

Dim frmitemsearch as New Form2()

W takim przypadku możesz utworzyć nowy konstruktor dla Form2 która akceptuje odwołanie do instancji Form1:

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

Spowoduje to zainicjowanie tego (zakładanego) elementu na poziomie klasy (frmgrn), gdy wystąpi Form2 jest tworzony, ustawiając go na wszystko, co jest przekazywane do konstruktora. Więc nazwałbyś nowego konstruktora w ten sposób:

Dim frmitemsearch as New Form2(Me)

W tym momencie, gdy tworzysz instancję Form2, dajesz mu istniejącą instancję Form1. Będzie przechowywać tę instancję w zmiennej na poziomie klasy. Wtedy za każdym razem, gdy masz taki kod Form2:

If IsNothing(frmgrn.searchbox.Text) Then

będziesz odwoływać się do rzeczywistego wystąpienia frmgrn zamiast tylko pustego odniesienia.