Lsteinme Geschrieben 10. April 2013 Teilen Geschrieben 10. April 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lbm1305 Geschrieben 10. April 2013 Teilen Geschrieben 10. April 2013 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 11. April 2013 Autor Teilen Geschrieben 11. April 2013 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Felix91 Geschrieben 11. April 2013 Teilen Geschrieben 11. April 2013 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Lsteinme Geschrieben 16. April 2013 Autor Teilen Geschrieben 16. April 2013 jau hat geklappt danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.