Search code examples
vb.netvisual-studio-2015datagridviewstreamreadermenustrip

Reference Form2.DataGridView from code on Form1


I am new to this forum. This is my first post, though I have spent a lot of time here searching for answers.

I have used VBA in Excel for many years, but have recently started using VB in Visual Studio 2015. I have created Form 1 as a MDIContainer and have another form opened inside this. This form (FormXYZ) contains a DataGridView.

Form1 has a MenuStrip and a I am currently trying to write the code, when one of these menu items is selected, to populate the DGV from a CSV. At this stage I am only trying to read the data and then I will work on the code to split the strings up.

Screenshot

I have no problem with selecting a file to import and the streamreader appears to read the file, but no data makes it to the DGV.

When I tried putting the code on FormXYZ for a button click event, the DGV was populated. So I believe the error is due to the way I am referencing the DGV, as the code for the MenuStrip_Click event is on Form1, but the DGV is on FormXYZ.

I would appreciate if somebody could point out where I am going wrong. My code is shown below.

Thanks Tepede

Imports System.IO

Public Class Form1 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    Dim FormXYZ As New FormXYZ()
    FormXYZ.MdiParent = Me 'Set the Parent Form of the Child window.  
    FormXYZ.Show() 'Display the XYZ form.  
End Sub
'-------------------------------------
'StripMenu click command to import CSV
Public Sub TSMIFileImportCSV_Click(sender As Object, e As EventArgs) Handles TSMIFileImportCSV.Click

    Dim Filename As String
    Dim RowValue As String

    Dim OpenFile As OpenFileDialog = New OpenFileDialog()

'Open file dialog
    With OpenFile
        .Filter = "CSV (*.CSV)|*.csv"
        .FilterIndex = 1
        .InitialDirectory = "C:\"
        .Title = "Open File"
        .CheckFileExists = False
    End With

    If OpenFile.ShowDialog() = DialogResult.OK Then
        Filename = OpenFile.FileName
    End If
    '---------

    ' Read CSV file content
    Dim objReader As StreamReader = New StreamReader(Filename)
    While objReader.Peek() <> -1
        RowValue = objReader.ReadLine()
 'Fist column is Boolean, the second should have the data from the CSV file
        FormXYZ.DataGridView1.Rows.Add(True, RowValue, "Test", "Test")
    End While
    objReader.Close()

End Sub

Solution

  • It looks like you are losing your instance to the FormXYZ that you displayed due to it's definition being in the Form Load. Expand the scope of that variable to be at the class level.

    Public Class Form1 
    
    Private FormXYZ As FormXYZ
    
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        FormXYZ = New FormXYZ()
        FormXYZ.MdiParent = Me 'Set the Parent Form of the Child window.  
        FormXYZ.Show() 'Display the XYZ form.  
    End Sub