I am not sure if you want to have a new instance of frmDisplay for each time you click on that datagrid or if you want the same to change. I am going to assume you want the same to change so here is one method: (there are other equally correct solutions)
On your main form, declare a global variable:
Dim fDisp as frmDisplay
On your frmDisplay, you need a Public Sub or Public Function that you can pass the value you want to display. I don't know anything about your program, so here is an example of what it would look like:
Public Sub displayValue(ByVal Str as String)
Me.TextBox1.Text = Str
End Sub
On you main form's datagrid's click event, you have to determine if frmDisplay is open, and pass the value to it in either case... Here is an example of what that would look like. You might have a question about a command I am using, I explain it below
If Not isNothing(fDisp) AndAlso Not isDisposed(fDisp)
'fDisp is currently open
If DataGrid1.SelectedIndicies(0) >= 0 Then
fDisp.displayValue(DataGrid1.Item(DataGrid1.SelectedIndicies(0)))
fDisp.Show()
End If
Else
'fDisp has either been closed, or never openned
If DataGrid1.SelectedIndicies(0) >= 0 Then
fDisp = new frmDisplay
fDisp.Show()
fDisp.displayValue(DataGrid1.Item(DataGrid1.SelectedIndicies(0)))
End If
End If
AndAlso and OrElse are called Circut Logic. When you use And and Or in If statements, it evaluates ALL of the cases AT ONCE. When you use AndAlso and OrElse, it checks each case individually and stops evaluating as soon as a condition is fulfilled. This way, you can avoid Null reference errors, and use only one if statement instead of embedded if's.
Search for more info on AndAlso and OrElse if you still don't understand them. Hope I helped!