Anel Hodzic
Anel Hodzic

Reputation: 209

Access to a child form

  Private Sub tsGradovi_Click(sender As Object, e As EventArgs) Handles tsGradovi.Click
        For Each f As Form In Application.OpenForms
            If TypeOf f Is frmGradovi Then
                f.Activate()
                Return
            End If
        Next
        Dim f2 As New frmGradovi
        f2.MdiParent = Me
        f2.Show()
        f2.WindowState = FormWindowState.Maximized
        resetdgvGradova()
    End Sub

On this way i add the Child form to my main Form.
On that frmGradovi form i have the datagridview. Now i added class to my project.

How can i add the datagridview source from my class.

this code is not helping

 frmGradovi.DGV.DataSource = SQLDataset.Tables(0)

Probabbly because frmGradovi is mdi child of form1.

Edit: enter image description here

At class konekcija i need to set the datasource for the frmGradovi form. But that frmGradovi form is an mdi child form of Form1

Upvotes: 1

Views: 742

Answers (1)

One way to avoid these types of conundrums is not to write Form-centric code. They are basically a sandbox for collection user input. The other element is to explicitly instance forms: In your code f2 is an instance of frmGradovi. Trying to reference it as frmGradovi elsewhere risks creating a new default instance of it (you'd later have 2 forms of Type frmGradovi in your Forms collection).

I dont know what a Gradovi or a konekcija is, so I will use a Customer example. My app might have a frmCustomer and a Customer class. When it comes time to display a certain customer, rather than the MDI parent form code or button click creating the form, I'd leave that job to the Customer class:

Public Class Customer
    ' myFrm is an instance of frmCustomer, which is a Type
    Private myFrm As frmCustomer
    Private myDT As DataTable

    Public Sub Display(Id As Int32)

        CustId = Id

        If myFrm Is Nothing Then
            myFrm = New frmCustomer
            ' MDI boilerplate code
            '...
            ' one time setup code like populate static CBOs:
            '...
        End If

        UpdateDisplay()
        myFrm.BringToFront()
    End Sub

    Public Sub UpdateDisplay()
        ' display code when something changes such as show new selected Customer
        ' e.g.:
        LoadCustDataToDataTable(CustId)

        With myFrm
            .tbfirstName.Text = FirstName
            .tbLastName.Text = LastName
            ' ...etc
            .dgvPastOrders.DataSource = myDT
        End With
    End Sub

The "key" is that the Customer class is in charge of the customer form. It creates it and retains a reference to it. When the user clicks Save that task too would be offloaded to the Customer.Save method.

You'll have other gyrations to add to handle when the user closes that form (if they are allowed to close versus just hiding it). In your current approach, your class could fish the reference to its form from the collection as it needs it.

Upvotes: 2

Related Questions