/ / null kontrola chyby pri kontrole zdieľanej hodnoty z form2 vo formulári 1 - vb.net, winforms, parent-child

null kontrola chyby pri kontrole zdieľanej hodnoty z form2 vo formulári 1 - vb.net, winforms, parent-child

Zobrazujem form2 na klávesovej skratke datagridu vo formulári1.Podľa kódu 1 formulára

 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

Skontrolujem hodnotu vyhľadávacieho poľa vo formulári 2, ak existuje nejaká hodnota alebo nie, ale vo formulári2 jej chyba v tomto riadku

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

... to všetko hodí chybu nullexception .. Som zmätená o tom, čo tu robím zle ... ako Skontrolujem, či hodnota je alebo nie, a potom vykonajte kód.

odpovede:

2 pre odpoveď č. 1

Táto čiarka vrhá a NullReferenceException:

If IsNothing(frmgrn.searchbox.Text) Then

Pretože táto premenná je null:

frmgrn

V tomto kóde nie je inicializácia premennej kdekoľvek vo vašom kóde (aspoň nie v kóde, ktorý ste nám ukázali.) Chcem na chvíľu predpokladať, na základe jej použitia, že frmgrn je premenná na úrovni triedy v Form2. Niečo ako toto:

Private frmgrn as Form1

To neinicializuje premennú. Stačí vytvoriť odkaz na jej zadržanie.

Avšak, okrem inicializácie, v tomto prípade musíte nielen inicializovať, ale potrebujete to špecificky pozri inštanciu Form1 ktoré už sú načítané. Jednoduchý spôsob, ako to urobiť, je Form1 preniesť odkaz pre seba Form2 keď vytvorí inštanciu Form2, Tu odkazujete na túto inštanciu:

frmitemsearch.ShowDialog()

Všimnite si však, že ste takisto neukázali frmitemsearch sa inicializuje. Budem predpokladať, že je to niečo takéto:

Dim frmitemsearch as New Form2()

V tomto prípade môžete vytvoriť nový konštruktor pre Form2 ktorý akceptuje odkaz na inštanciu Form1:

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

Tým by sa inicializoval (predpokladaný) člen na úrovni triedy (frmgrn) pri inštancii Form2 je vytvorený a nastaví ho na to, čo prešiel konštruktérovi. Takže zavoláte nového konštruktéra takto:

Dim frmitemsearch as New Form2(Me)

V tomto okamihu, keď vytvoríte inštanciu Form2, by ste mu dali existujúcu inštanciu Form1, Uloží túto inštanciu do premennej na úrovni triedy. Potom budete kedykoľvek mať takýto kód Form2:

If IsNothing(frmgrn.searchbox.Text) Then

by ste odkazovali na aktuálnu inštanciu frmgrn namiesto len prázdneho odkazu.