Archief - VB.NET variabelen ophalen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

cooLopke

Legacy Member
Beste 9livers

Ik ben een programma aan het maken die meerdere Windows Forms bevat. Echter wil ik de beste gebruiksmethode toepassen om variabelen tussen de Windows Forms makkelijk op te halen. Ik gebruik Crystal Reports om rapporten te maken.


Situatieschets:

toestel_Form
Dit is een form die alle toestellen ophaalt via een datagridview. Hier bevindt zich een print knop die een nieuw form toont (print_select_Form).

print_select_Form
Hier zie je een datagridview en wordt opgevuld met de rapportbeschrijving via een db. Indien men een rapport kiest toont er zich een nieuw form (print_Form)

print_Form
Hier is de "Crystalreportsviewer" toegevoegd die het juiste Crystal Reports rapport ophaalt. Echter om deze te tonen heb ik de juiste bestandsnaam nodig. (zie Report_Class)

dbo.rapporten
Dit is een tabel die de velden id, naam ,omschrijving en bestandsnaam bevat. Het veld bestandsnaam is het belangrijkste want hier staat de naam van mijn rapport in.

Report_Class
Dit is een klasse met Property values naam, omschrijving en bestandsnaam

code toestel_Form - btnPrint_Click (print knop)
Code:
        Dim pr As New print_select_Form
        Dim p As New print_Form
        Dim rp As New Report_Class("toestel")

        Call pr.fill_printdata(rp.Naam)
        pr.ShowDialog()
        rp = pr.GetReport(rp)
        
        If rp.Bestandsnaam = "calls_list.rpt" Then
            Call PrepareReport_CallsList()
        End If

        Call p.load_report(rp.Bestandsnaam)
        p.ShowDialog()
code print_select_Form
Code:
Dim rp As New Report_Class()
Sub fill_printdata(rp_naam As String)

        Dim ssql As String
        Dim ds As DataSet
        Dim dc As New datacontrol_class

        ssql = "SELECT id, rp_naam, rp_omschrijving as Document, rp_bestandsnaam FROM rapport"
        ssql += " where rp_naam='" & rp_naam & "'"

        ds = dc.GetDataSet(ssql)

        dgvPrint.DataSource = ds.Tables(0)
        dgvPrint.AutoResizeColumns()

        dgvPrint.Columns.Item(0).Visible = False
        dgvPrint.Columns.Item(1).Visible = False
        dgvPrint.Columns.Item(3).Visible = False
End Sub

Private Sub dgvPrint_CellDoubleClick(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvPrint.CellDoubleClick

        If dgvPrint.SelectedRows.Count = 1 Then
            rp.Bestandsnaam = dgvPrint.SelectedRows(0).Cells.Item(3).Value
            rp.Naam = dgvPrint.SelectedRows(0).Cells.Item(1).Value
            rp.Omschrijving = dgvPrint.SelectedRows(0).Cells.Item(2).Value
        End If
        Me.Dispose()
End Sub

Function GetReport(rpPrint As Report_Class) As Report_Class
        rpPrint = rp
        Return rpPrint
    End Function

Zoals je ziet maak ik gebruik van een functie om de waarde van "bestandsnaam" te achterhalen in toestel_Form, want dit heb ik nodig om het correcte bijhorende rapport te tonen. Ook heb ik de bestandsnaam nodig, vermits er extra dingen moeten gebeuren als de bestandsnaam "calls_list.rpt" is.

Volgens mij bestaat er een makkelijkere manier om de waarde van "Bestandsnaam" te achterhalen. Ik weet dat ik de variabele in de klasse Report_Class public kan maken, maar men heeft mij steeds geleerd op school om dit private te maken. Of moet dit toch public worden?

Iemand die dit even kan bekijken en mij kan helpen? Alvast bedankt!

Grtz

cooLopke

cptKangaroo

Legacy Member
Eigenlijk zou je een aparte class moeten hebben die alle noodzakelijke informatie bundelt, want nu spreid je de nodige informatie (bestandsnaam, etc.) uit over verschillende Forms terwijl Forms voornamelijk bedoeld zijn om output weer te geven.

Je kan uiteraard ook alle informatie bundelen in één Form. Je gaat mogelijk wel met Delegates moeten werken als je vanuit de ene Form rechtstreeks controls wil veranderen op een andere Form.

Tussen Public en Private heb je nog Friend om variabelen enkel in je programma zichtbaar te maken naar andere classes.

De code die je gepost hebt, is wel nogal onoverzichtelijk: in de tweede codeblock kan die "Dim rp As New Report_Class()" lijn niet want Dim is enkel binnen Sub of Function, en je GetReport() function is nogal raar want de rpPrint parameter die je zelf eerst moet geven wordt gewoon vervangen door die (lokale?) rp ?

Destiser

Legacy Member
cooLopke zei:
Beste 9livers

Ik weet dat ik de variabele in de klasse Report_Class public kan maken, maar men heeft mij steeds geleerd op school om dit private te maken. Of moet dit toch public worden?

Lees vooral ook opmerking boven mij! Maar om op deze simpele vraag te antwoorden:

variabelen hou je idd best private, maar je kan er wel een read-only toegang aan geven via properties.

cooLopke

Legacy Member
Bedankt voor de reacties. Kmoet idd, mss beter een extra klasse maken waar gewoon al mijn functies en subs inzitten.

Indien er nog opmerkingen of tips zijn mag je deze altijd vermelden.

Bedankt!

Sent from my Blade using Tapatalk
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan