Zum Inhalt springen

VB.net VisualStudio Designer Parameter vorbelegen


Lsteinme

Empfohlene Beiträge

Hi leuts,

Problem wie folgt:

Ich hab eine GUI-Componete die eigentlich erst zur laufzeit korrekt erstellt werden kann,

liegt daran das sie für einige Dimensionierungen des Tabellayouts was darin abläuft einen mit DB-Daten gefüttertes Dictionary braucht.

Nun die Frage: kann ich dem Designer irgendwie fixe Standardwerte geben die er für das Anzeigen auswerten kann?

Es handelt sich leider um ein größeres Fenster, welches neben meiner Componete noch andere enthält und evt auch noch erweitert werden soll, daher is es unschön wenn der Designer nichtmehr tut^^

Die Fehlermeldung wegklicken führt ja zu leider dazu das die Componete einfach vom Layout entfernt wird.

Hier mal der Code der Componete, den ich von hand schreiben muss, den Designercode erspar ich euch mal^^

Public Class Projekt_PPQA_Management

    'true if process is NA else false saves "old" states

    Public states As New Dictionary(Of Integer, Boolean)


    Public boxes As New Dictionary(Of Integer, System.Windows.Forms.CheckBox)

    Sub New([B][U]proj As Projekt[/U][/B])

        ' This call is required by the designer.

        InitializeComponent()

        MainPane.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset

        ' Add any initialization after the InitializeComponent() call.

        MainPane.RowCount = Process_Dict.Keys.Count + 2


        While (MainPane.RowStyles.Count <= MainPane.RowCount - 1)

            MainPane.RowStyles.Add(New RowStyle(SizeType.AutoSize))

        End While

        MainPane.RowStyles.Add(New RowStyle(SizeType.Percent, 50.0!))

        MainPane.ColumnCount = 2

        MainPane.ColumnStyles(0).SizeType = SizeType.AutoSize

        MainPane.RowStyles(0).SizeType = SizeType.AutoSize

        MainPane.RowStyles(1).SizeType = SizeType.AutoSize

        Dim ProcessHeaderLabel As New System.Windows.Forms.Label

        ProcessHeaderLabel.Text = "Processnames"

        ProcessHeaderLabel.Font = New System.Drawing.Font(ProcessHeaderLabel.Font, FontStyle.Bold)

        ProcessHeaderLabel.Dock = DockStyle.Fill

        ProcessHeaderLabel.TextAlign = ContentAlignment.MiddleCenter

        Dim NALabel As New System.Windows.Forms.Label

        NALabel.Text = "Enabled for this Project"

        NALabel.Font = New System.Drawing.Font(ProcessHeaderLabel.Font, FontStyle.Bold)

        NALabel.AutoSize = True

        NALabel.Dock = DockStyle.Fill

        NALabel.TextAlign = ContentAlignment.MiddleLeft

        'the two headers

        MainPane.Controls.Add(ProcessHeaderLabel)

        MainPane.Controls.Add(NALabel)


        For Each p As Integer In Process_Dict.Keys

            Dim namelabel As New System.Windows.Forms.Label

            namelabel.AutoSize = True

            namelabel.Text = Process_Dict(p)

            namelabel.Dock = DockStyle.Fill

            namelabel.TextAlign = ContentAlignment.MiddleLeft


            Dim NACheckbox As New System.Windows.Forms.CheckBox

            boxes(p) = NACheckbox

            If (proj.NA_Processes.Contains(p)) Then

                NACheckbox.Checked = True

                states(p) = True

            Else

                NACheckbox.Checked = False

                states(p) = False

            End If

            NACheckbox.CheckAlign = ContentAlignment.MiddleCenter

            MainPane.Controls.Add(namelabel)

            MainPane.Controls.Add(NACheckbox)

        Next

    End Sub

End Class

Gruß Lucas

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es handelt sich um eine selbst erstellte Komponente?

Du kannst Variablen mit Standardwerten initialisieren. Wenn Du dann die korrekten Daten setzt, werden diese dann überschrieben.

Musst Dich dann halt daran kümmern, dass das Control / die Komponente dann neu gezeichnet wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es handelt sich um eine selbst erstellte Komponente?

Du kannst Variablen mit Standardwerten initialisieren. Wenn Du dann die korrekten Daten setzt, werden diese dann überschrieben.

Musst Dich dann halt daran kümmern, dass das Control / die Komponente dann neu gezeichnet wird.

Jau is eine selbst erstellte.

Verpass ich da grade irgendwas? wenn sich nur das Tablelayout später verändert, muss ich dann nicht nur für dieses layout ein Refresh aufrufen? oder muss ich das für das volle Window machen? weil wenn ich meinen Code nun entsprechend abändere:

Public Class Projekt_PPQA_Management

    'true if process is NA else false saves "old" states

    Public states As New Dictionary(Of Integer, Boolean)


    Public boxes As New Dictionary(Of Integer, System.Windows.Forms.CheckBox)

    Dim realini As Boolean = False

    'this is only a Methode for the designer, IT DOES NOT DISPLAY THE CORRECT FULL LAYOUT!

    Sub New()

        InitializeComponent()

        MainPane.RowCount = 2

        MainPane.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset

        While (MainPane.RowStyles.Count <= MainPane.RowCount - 1)

            MainPane.RowStyles.Add(New RowStyle(SizeType.AutoSize))

        End While

        MainPane.RowStyles.Add(New RowStyle(SizeType.Percent, 50.0!))

        MainPane.ColumnCount = 2

        MainPane.ColumnStyles(0).SizeType = SizeType.AutoSize

        MainPane.RowStyles(0).SizeType = SizeType.AutoSize

        MainPane.RowStyles(1).SizeType = SizeType.AutoSize

        Dim ProcessHeaderLabel As New System.Windows.Forms.Label

        ProcessHeaderLabel.Text = "Processnames"

        ProcessHeaderLabel.Font = New System.Drawing.Font(ProcessHeaderLabel.Font, FontStyle.Bold)

        ProcessHeaderLabel.Dock = DockStyle.Fill

        ProcessHeaderLabel.TextAlign = ContentAlignment.MiddleCenter

        Dim NALabel As New System.Windows.Forms.Label

        NALabel.Text = "Enabled for this Project"

        NALabel.Font = New System.Drawing.Font(ProcessHeaderLabel.Font, FontStyle.Bold)

        NALabel.AutoSize = True

        NALabel.Dock = DockStyle.Fill

        NALabel.TextAlign = ContentAlignment.MiddleLeft

        'the two headers

        MainPane.Controls.Add(ProcessHeaderLabel)

        MainPane.Controls.Add(NALabel)

    End Sub


    'This special init Methode is needed, so the Designerview (bevor runtime) won't crash

    Public Sub myGUIinit(proj As Projekt)

        If Not realini Then

            ' This call is required by the designer.

            InitializeComponent()


            ' Add any initialization after the InitializeComponent() call.

            realini = True

            MainPane.RowCount = Process_Dict.Keys.Count + 2

            MainPane.CellBorderStyle = TableLayoutPanelCellBorderStyle.Inset

            While (MainPane.RowStyles.Count <= MainPane.RowCount - 1)

                MainPane.RowStyles.Add(New RowStyle(SizeType.AutoSize))

            End While

            MainPane.RowStyles.Add(New RowStyle(SizeType.Percent, 50.0!))

            MainPane.ColumnCount = 2

            MainPane.ColumnStyles(0).SizeType = SizeType.AutoSize

            MainPane.RowStyles(0).SizeType = SizeType.AutoSize

            MainPane.RowStyles(1).SizeType = SizeType.AutoSize

            Dim ProcessHeaderLabel As New System.Windows.Forms.Label

            ProcessHeaderLabel.Text = "Processnames"

            ProcessHeaderLabel.Font = New System.Drawing.Font(ProcessHeaderLabel.Font, FontStyle.Bold)

            ProcessHeaderLabel.Dock = DockStyle.Fill

            ProcessHeaderLabel.TextAlign = ContentAlignment.MiddleCenter

            Dim NALabel As New System.Windows.Forms.Label

            NALabel.Text = "Enabled for this Project"

            NALabel.Font = New System.Drawing.Font(ProcessHeaderLabel.Font, FontStyle.Bold)

            NALabel.AutoSize = True

            NALabel.Dock = DockStyle.Fill

            NALabel.TextAlign = ContentAlignment.MiddleLeft

            'the two headers

            MainPane.Controls.Add(ProcessHeaderLabel)

            MainPane.Controls.Add(NALabel)


            For Each p As Integer In Process_Dict.Keys

                Dim namelabel As New System.Windows.Forms.Label

                namelabel.AutoSize = True

                namelabel.Text = Process_Dict(p)

                namelabel.Dock = DockStyle.Fill

                namelabel.TextAlign = ContentAlignment.MiddleLeft


                Dim NACheckbox As New System.Windows.Forms.CheckBox

                boxes(p) = NACheckbox

                If (proj.NA_Processes.Contains(p)) Then

                    NACheckbox.Checked = True

                    states(p) = True

                Else

                    NACheckbox.Checked = False

                    states(p) = False

                End If

                NACheckbox.CheckAlign = ContentAlignment.MiddleCenter

                MainPane.Controls.Add(namelabel)

                MainPane.Controls.Add(NACheckbox)

            Next

        End If

        MainPane.Refresh()

    End Sub

End Class

und beim Tapwechsel der GUI welche meine Form enthält die myGUIinit Methode aufrufe, tut sich garnix, die beiden Labels die ich standartmäßig einbauen kann bleiben erhalten, aber von einer neuzeichnung ist nichts zu sehen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke der Trick, dass ganze nicht im Konstruktor zu machen, sondern im WindowLoaded event, dürfte hier schon abhilfe schaffen.

Btw: Keine Daten Initialisierung im Konstruktor. Da werden nur Controls für die GUI initialisiert und Render spezifische Properties gesetzt (Farben, Styles, wenn es sein muss auch default Texte). Für alles andere gibt es eben das Loaded event.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...