Erweiterter Umgang mit typisiertem DataSet -> Tabellennamen lesen/Namensübergabe etc.

  • VB.NET
  • .NET (FX) 4.0

Es gibt 351 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Probier vlt. erstma wie ich gesagt hab - das ist momentan weniger umzubauen.
    und dann vorm "Tree hauen" Backup machen!

    das mit deine Dialoge stimmt übrigens nicht.
    Wenn da der User abbricht kriegt er die Meldung er habe etwas ungültiges ausgewählt.
    Das ist ja bei einem Dialog-Abbruch nicht der Fall.

    Zeilen #28-42 bewirken garnix, weil das Dataset hat schon vorher geladen.
    Ansonsten bringe ich nochmal Dialoge benutzen ist einfach in Erinnerung - imo sollte man Dialoge aufs Form ziehen.
    Spielt hier aber für die Useabilität konkret keine Rolle, weil die Dialoge können an dieser Stelle eh nur einmal genutzt werden.
    Aber wenn du mal an anderer Stelle Dialoge verwendest.

    ErfinderDesRades schrieb:

    Zeilen #28-42 bewirken garnix, weil das Dataset hat schon vorher geladen.

    Da hatte ich gar nicht mehr drüber geschaut - ist aber jetzt weg bzw. funzt nun.
    Kannst du mir noch sagen, warum er bei Zeile 23 und 38 die Anwendung eben nicht beendet?

    VB.NET-Quellcode

    1. Public Sub AppBeenden()
    2. My.Settings.Save()
    3. Application.Exit()
    4. End Sub


    Mit dem DTS das hab ich hinbekommen - da muss man ja erstmal drauf kommen.
    Ich hab den Tree jetzt in das große Dts eingearbeitet - wird auch jetzt alles ordentlich auf dem externen Pfad gespeichert, also alles so wie gewollt :thumbsup:

    Ich muss also auf jede Form, die mit dem DTS arbeitet folgendes einfügen?:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. Dts.Register(Me, False)
    4. Dts.ReloadDts()
    5. End Sub


    Mein "Startcode" jetzt:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. 'TODO Anmeldeformular in den Start einfügen, wo sich der MA erst anmelden muss.
    4. 'nach erfolgreicher Anmeldung werden die My.Settings gesetzt und erst dann der Rest gestartet.
    5. 'Nach Methode dialogresult = OK (was nur nach erfolgreicher Anmeldung der Fall ist)
    6. '
    7. 'Statusbar füllen
    8. #If DEBUG Then
    9. My.Settings.Mitarbeiter_aktiv = "Mitarbeiter, Test"
    10. My.Settings.Mitarbeiter_Funktion = "TL"
    11. My.Settings.Mitarbeiter_Standort = "Teststandort"
    12. #End If
    13. 'Datenverzeichnis prüfen
    14. If Not Directory.Exists(My.Settings.Datenverzeichnis) Then
    15. msgExclamation("Datenverzeichnis ungültig, bitte auswählen!")
    16. Using fldBrowse As New FolderBrowserDialog()
    17. If fldBrowse.ShowDialog() = DialogResult.OK Then
    18. My.Settings.Datenverzeichnis = fldBrowse.SelectedPath
    19. My.Settings.Save()
    20. Else
    21. 'TODO app wird nicht beendet
    22. msgError("kein Pfad ausgewählt, Anwendung wird beendet!")
    23. AppBeenden()
    24. Exit Sub
    25. End If
    26. End Using
    27. End If
    28. Dim fi = New FileInfo($"{My.Settings.Datenverzeichnis}\dtsLogistik.xml")
    29. If Not fi.Exists Then
    30. msgExclamation("Datendatei "" dtsLogistik.xml "" ungültig, bitte auswählen")
    31. Using fiDlg As New OpenFileDialog()
    32. fiDlg.InitialDirectory = My.Settings.Datenverzeichnis
    33. fiDlg.Filter = "Datendateien (*.xml)|*.xml"
    34. If fiDlg.ShowDialog() = DialogResult.OK Then
    35. fi = New FileInfo(fiDlg.FileName)
    36. Else
    37. msgError("keine Datei ausgewählt, Anwendung wird beendet!")
    38. AppBeenden()
    39. Exit Sub
    40. End If
    41. End Using
    42. End If
    43. Dts.Register(Me, True).DataFile(fi.FullName).Fill
    44. Dts.FillTree(TV_main)
    45. Me.TSS_main_lbl_tageskontrollblätter.Text = "Tageskontrollblätter mitführen bis einschl.: " & Date.Today.AddDays(-28)
    46. End Sub


    Noch eine Frage:
    Ist es eigentlich vor dem Speichern des DataSets in die XML notwenig mit "Me.Validate()" zu arbeiten?

    Ansonsten füll' ich nachher die Testdaten mal rein und schick' dir wenn das alles durch ist das Projekt mal zum drüberschauen, auch bzgl. der Daten / Relationen etc.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tragl“ ()

    tragl schrieb:

    Ich muss also auf jede Form, die mit dem DTS arbeitet folgendes einfügen?:
    Nur dieses:

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponent()
    3. Dts.Register(Me, False)
    4. End Sub
    Geladen ist es ja schon.



    VB.NET-Quellcode

    1. Public Sub AppBeenden()
    2. My.Settings.Save()
    3. Application.Exit()
    4. End Sub
    brauchst du nicht.
    Eine Anwendung schliesst automatisch, wenn das MainForm schliesst.
    Und dann werden auch automatisch die Settings gespeichert.
    Kannst also so machen:

    VB.NET-Quellcode

    1. msgError("keine Datei ausgewählt, Anwendung wird beendet!")
    2. Me.Close
    3. Return
    (Exit Sub wird garnimmer verwendet)



    Me.Validate hat was mit nicht explizit abgeschlossenen , also "unfertigen" Eingaben zu tun. Standard-Verhalten ist, dass die verworfen werden, was oft dann überraschend ist.
    Ich mochte es glaub lieber, unfertige Eingaben dann abzuschliessen und zu übernehmen.



    schick' dir
    Jo - vor allem wie du mit den MdiChildForms arbeitest ist ja ein Anti-OOP-Gräuel.


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Jo - vor allem wie du mit den MdiChildForms arbeitest ist ja ein Anti-OOP-Gräuel.

    Inwiefern?


    Bin grad' dabei die Testdaten einzutragen. Dabei sind mir natürlich noch einige Fehler in den Beziehungen usw. aufgefallen und ich konnte alles korrigieren - bis auf:



    Warum meckert er wenn ich das Feld leer lasse? Standardwert ist auf "" gesetzt -> also leer, testweise hab' ich sogar auf allowDbNull gesetzt, aber immer das Gleiche.


    VB.NET-Quellcode

    1. msgError("keine Datei ausgewählt, Anwendung wird beendet!")
    2. Me.Close
    3. Return

    erzeugt dann wenn abgebrochen wird:



    Gibt's eine Möglichkeit, dass das DGV beim Öffnen der Form leer bleibt?
    Ich möchte gerne, dass es erst Einträge anzeigt wenn ich auch "suchen" klicke.

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Bin grad' dabei die Testdaten einzutragen.
    Der Fehler sagt, dass Daten korrupt sind. Sieht auch so aus. Der DatenAbfrage-Datensatz hat kein Kennzeichen - das ist nicht gültig.
    Oder ein Fehler bei der Konfiguration der ComboboxColumn.



    Du könntest initial einen Filter zuweisen, der nix findet - etwa bs.Filter = "1=0".

    ErfinderDesRades schrieb:

    Der Fehler sagt, dass Daten korrupt sind. Sieht auch so aus. Der DatenAbfrage-Datensatz hat kein Kennzeichen - das ist nicht gültig.
    Oder ein Fehler bei der Konfiguration der ComboboxColumn.


    Moin :)
    Anbei mal die Einstellung der ComboBox - das Kennzeichen soll leer sein dürfen, es gibt Tage wo der Mitarbeiter kein Fahrzeug bewegt.



    Das mit dem Filtern der Bindingsource auf "1=0" klappt :thumbup:


    Ich hab Probleme mit den Forms, die über .ShowDialog() geöffnet werden. Das 1. Öffnen klappt, beim 2. Mal ist die Form leer. Warum?



    Und warum zeigt er mir die Spalte ID an, obwohl ich die im Entwurf/Designer explizit ausgeblendet habe?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    tragl schrieb:

    Anbei mal die Einstellung der ComboBox - das Kennzeichen soll leer sein dürfen, es gibt Tage wo der Mitarbeiter kein Fahrzeug bewegt.
    Hmm - könnte mit einer zu laxen Relation zusammenhängen.
    Also Im Datenmodell mag das richtig und sinnvoll sein, dass ein Datenabfrage auf kein Fahrzeug verweist.
    Aber eine Combobox grätscht ab, wenn sie DbNull anzeigen soll, weil das ist in ihrer DataSource nicht enthalten.
    Vermutlich ist die Lösung, einen "<Kein Fahrzeug>"-Datensatz zu schaffen.
    Den kann man auch über die Combo anwählen - was mit DbNull ja nicht geht.

    Und wie gesagt: Relation mit ForeignKeyConstraint, Löschweitergabe, kein AllowNull für den FK.

    Aber die Fehlermeldung aus post#64 sagt eigentlich, dass die Relation durchaus streng ist.

    Was auch ein gern gemachter Fehler ist, der ComboColumn irgendeine FahrzeugBindingSource zuzuweisen, die parallel auch an was anneres gebunden ist.
    eine ComboboxColumn braucht ihre eigene BindingSource, und deren Datasource muss direkt die Tabelle sein (nicht eine andere bindingSource). Und kein Filter darf sie auch nicht haben.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Also die Comboboxen scheinen's echt insich zu haben.
    Mit der Box "Funktion" klappt die Auswahl, Mit der Box "StandortID" nicht.. ich versteh nur noch Bahnhof.. liegt das an den unterschiedlichen DisplayMember und ValueMember?
    In dem Beispiel soll er mir den Standortnamen anzeigen, die StandortID aber abspeichern.
    Edit: Hab's jetzt umgestellt auf "Standortname" -> "Standort" - nu' gehts ?(




    ErfinderDesRades schrieb:

    BindingSouce.Filter.
    aber meist führt das zu solchen Fehlern wie in post#64, wenn der BindingSource einer comboColumn ein Filter gesetzt ist.


    Das mit dem Filtern probier ich mal wenn alle Testdaten drin sind. Muss ich ja dann in Form_load() einbauen, damit ein Mitarbeiter aus Standort 2 keine Einträge aus Standort 1 im Dropdown auswählen kann (z.B.)
    Aber das kommt später. Erstmal das mit den Comboboxen hinkriegen
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „tragl“ ()

    ;( Die wird ja automatisch im Designer generiert... was ein Bullshit..
    un nu? Die Comboboxen wären schon wichtig - man kann sich ja nicht alle evtl. vorhandenen Werte behalten...

    ErfinderDesRades schrieb:

    Es kann wie gesagt an der BindingSource liegen.

    EDIT: kann es sein, dass es etwas mit den Datentypen ODER Null-erlaubt/nicht erlaubt zu tun hat?
    Soweit ich das sehen kann sind das alles Int(32)-Felder -> muss das Feld, in welches die Werte gespeichert werden sollen vll System.String sein?

    Folgendes geht nicht:

    Quellcode

    1. 4.1.4 Standorte -> MitarbeiterID
    2. Soll Mitarbeiter.expFullname anzeigen -> Mitarbeiter.ID speichern
    3. 4.1.5 PLZ-Liste -> TourNr
    4. Soll Tour.TourNr anzeigen und dies auch speichern
    5. 4.1.6 DatenabfrageHc -> MitarbeiterID | TourNr geht hier komischerweise (erlaubt hier aber Nulls)
    6. Soll Mitarbeiter.expFullname anzeigen -> Mitarbeiter.ID speichern
    7. 4.1.7 DatenabfrageReha -> MitarbeiterID | TourNr geht auch hier (erlaubt auch hier Nulls)
    8. Soll Mitarbeiter.expFullname anzeigen -> Mitarbeiter.ID speichern
    9. 4.1.9 User -> MitarbeiterID
    10. Soll Mitarbeiter.expFullname anzeigen -> Mitarbeiter.ID speichern


    Die Bindingsources wurden alle über den Designer erzeugt. Ich hab' dir das
    nochmal angehangen, evtl findest du ja den / die Fehler :?: :thumbup:
    Dateien
    • LogistikTool.zip

      (686,92 kB, 28 mal heruntergeladen, zuletzt: )
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „tragl“ ()

    einen Fehler fand ich schoma:
    Du musst nicht in jedem Form, was öffnet, das Dataset neu laden.
    Das Dataset wird einmalig in frmMain geladen und gut - dann ist es da.
    Du musst nur alle Forms, die damit arbeiten wollen, auch darauf registrieren.
    Damit sie ihre Bindings auch auf dieses eine Dataset umverlagern.
    Weil im Designer noch hat jedes Form sein eigenes Dataset, was von den Daten des MainForm-Dataset nichts weiss.
    Also der Fehler hat (noch) keine merkliche Auswirkung, nur wird ständig derselbe Datenbestand immer neu geladen.



    4.1.4 Standorte -> MitarbeiterID
    Die Relation ist falschrum.
    Oder die Denkweise - ja, ich glaub die Denkweise.
    Die 1:n Relation Standort->Mitarbeiter sagt aus, dass ein Standort mehrere Mitarbeiter hat.
    Und jeder Mitarbeiter hat "seinen" Standort.
    Daraus kann man einen Mitarbeiter-JoiningView basteln mit einer Combobox, die den verknüpften Standort anzeigt und zur Auswahl bereitstellt - den einzigen (pro Relation) (Haupt)Standort dieses Mitarbeiters.

    Man kann aber keinen Standort-JoiningView basteln mit einer Combobox, die den verknüpften Standort anzeigt und zur Auswahl bereitstellt. Weil Standort hat keinen einzigen Mitarbeiter, sondern jeder Standort hat deren viele.

    Sinnvoll wäre an dieser Stelle ein Parent-Child-View möglich, der zu jedem Standort in einem zweiten DGV alle Mitarbeiter präsentiert, die ihm angehören.

    Ups - achnee - du willst ja über die Standort.MitarbeiterId verknüpfen.
    Dazu gibts aber gar keine Relation im Dataset.
    Also es fehlt die Relation Mitarbeiter.ID->Standort.MitarbeiterID (mit ForeignKey-einschränkung wohlgemerkt).
    Trotzdem kann man die ComboColumn tatsächlich genau so verknüpfen, wie du gemacht hast - Kompliment übrigens!.
    Nur die Daten müssen den erforderlichen Bedingungen entsprechen, und ohne Relation, die das erzwingt, ist das unwahrscheinlich.
    Soweit meine Theorie bisher, ich forsche weiter.
    Jo - das ist das Problem.
    Alle Standorte haben als MitarbeiterId 0 eingetragen - es gibt aber keinen Mitarbeiter mit Id=0
    Das bewirkt, Wie die Fehlermeldung sehr schön sagt: "Der ComboboxCell-Wert ist ungültig."
    Hab jetzt im Dataset alle MitarbeiterIDs auf -1 (Mustermann) gesetzt, und geht.

    (Übrigens würdich dir wirklich den SolutionExplorer empfehlen, der macht saubere Zips ohne Binaries.)
    Dateien

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „ErfinderDesRades“ ()

    4.1.5 PLZ-Liste -> TourNr

    Hier gehts ums Zufügen eines PLZ-Datensatzes.
    Beim Zufügen generiert das Dataset ja Werte entsprechend der DataColumn.DefaultValue-Eigenschaft.
    Der Wert ist aber ungültig, weil verweist nicht auf eine gültige Tour.
    Das habich mit folgendem Hack gefixt:

    VB.NET-Quellcode

    1. Public Class dlgPlzListe
    2. Public Sub New()
    3. InitializeComponent()
    4. Dts.Register(Me, False)
    5. Dim col = Dts.PlzListe.TourNrColumn
    6. col.DefaultValue = Dts.Tour.First.TourNr ' ein Dataset-Hack, damit die DGV-Zufügezeile eine TourNr generiert, entsprechend der FK-Constraint
    7. End Sub

    Imo günstiger wäre eine StammDatenpflege mit Parent-ChildViews, ohne JoiningViews.
    Ist auch einfacher zu basteln.
    Etwa ein ParentChild-View für Tour->PLZ (ich weigere mich, es "Liste" zu nennen - was immer es ist: es ist keine "Liste") würde beider Tabellen Datenpflege abdecken, und du bräuchtest in dgvPLZ nichtmal eine ComboboxColumn einzufrickeln.
    Dateien

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    So, ich hab nu deine Form-Gräuseligkeiten weg-gebastelt, und ein Naviagationssystem mit UserControls hin.
    Dazu habich deine Dialog einfach umgefrickelt, ohne iwas zu ändern. Also ist alles noch drauf, manche (die meisten) Buttons sind nicht aber mehr sinnvoll (schliessen, speichern).
    Aber weiters musste ich auch noch die Helpers bisserl erweitern.
    Ich hab auch ein ControlStyling eingebaut, mit dem man ein bischen einheitliches DGV-Design reinklatschen kann.
    Du hast ja sowas ähnliches angefangen, aber noch ohne Funktion.
    Dateien

    ErfinderDesRades schrieb:

    So, ich hab nu deine Form-Gräuseligkeiten weg-gebastelt, und ein Naviagationssystem mit UserControls hin.
    Dazu habich deine Dialog einfach umgefrickelt, ohne iwas zu ändern. Also ist alles noch drauf, manche (die meisten) Buttons sind nicht aber mehr sinnvoll (schliessen, speichern).
    Aber weiters musste ich auch noch die Helpers bisserl erweitern.
    Ich hab auch ein ControlStyling eingebaut, mit dem man ein bischen einheitliches DGV-Design reinklatschen kann.
    Du hast ja sowas ähnliches angefangen, aber noch ohne Funktion.


    Ich hab mir grad mal schnell den Laptop mit in den Garten geholt, um mal reinzugucken :rolleyes:
    Sieht alles nicht schlecht aus, allerdings macht er leider noch immer Datenfehler( zumindest in deiner Version 07, 01 hab ich noch nicht reingeschaut.)
    Die Variante aus Version 01 ist ggf. realisierbar - allerdings hab ich wie gesagt vor Die Comboboxen bzw. deren Bindingsources vorher zu filtern,
    sodass mitarbeiter aus standort1 nicht die daten aus standort2 angezeigt bekommt und einsehen kann - damit wäre die variante mit dem 1. wert dann auch wieder
    hinfällig :)


    Das Programm ist später aber so gedacht, dass man zwischen den einzelnen Forms switchen darf, d.h. ich ruf' mir Tourenplan auf und dazu noch Urlaubsplaner (beides noch nicht im Programm) und kann
    oben über einen erzeugten Button hin und her switchen
    Das geht sicherlich sinnvoller über dein TabControl - muss aber auch so lösbar sein.

    Und, wenn ich den Tree wegswitche soll der Platz für die Forms freigegeben werden. In meiner Version lief das ja so :)

    ich hab mal einen kleinen Ausschnitt aus unserem WaWi angehangen - das zeigt genau die Situation auf :)
    Hier werden nach Aufruf aus dem Tree Buttons oben erzeugt, mit denen man switchen kann. Oben rechts sieht mann, das es eine ChildForm sein muss, denn man kann die Minimieren, Maximieren und schließen.


    Ist aber Zukunft und vor allem Design. Erstmal muss das mit der Dateneingabe in den Raw-Views klappen, die Relationen müssen passen und danach kommen die Sachen für die User selbst dran.
    Aber: was ist verwerflich an meinem Parent-Child-Form-Konstrukt?


    Zu dem Problem mit den ComboBoxen im DataGridView:

    Laut meinem Verständnis haben da bei den ComboBoxen die Datentypen nicht zusammengepasst.
    Das sagt ja eigentlich auch der Formatting-Fehler aus.
    Gibt's übringes eine Methode, die Fehlerabfang-Methode die ich hinter den Forms hinterlegt hab für das jeweilige DataGridView in eine
    Klasse zu packen, dass ich das nur einmal erstellen muss? (Soweit bin ich mit der Lektüre noch nicht :) )

    Beispiel User Raw View: (in meiner Version dlgUserRaw)
    DGV läuft auf "bsUser" - wird im Designer generiert, habe ich in meiner aktuellen Version umbenannt mit prefix "bs".
    Combobox für MitarbeiterID liest werte aus Tabelle Mitarbeiter (bsCbMitarbeiter)
    Displaymember = Mitarbeiter.expFullname (String)
    Valuemember = Mitarbeiter.ID (Int32)
    wird gespeichert in User.MitarbeiterID (Int32)

    Kann es sein, dass die Combobox nicht mit den unterschiedlichen Datentypen (String, Int) klar kommt? Nach meinem Verständnis soll dir
    ja nur die Strings(Mitarbeiter.expFullname) anzeigen, gespeichert wird jedoch der Int (Mitarbeiter.ID)

    Bei allen anderen Comboboxen, die nicht mit Integer arbeiten klappt das nämlich seltsamerweise.
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „tragl“ ()

    Gibt's übringes eine Methode, die Fehlerabfang-Methode die ich hinter den Forms hinterlegt hab für das jeweilige DataGridView in eine
    Klasse zu packen, dass ich das nur einmal erstellen muss?

    Habich grad gemacht, jetzt abonniere ich im ControlStyling für jedes DGV einen generischen DataError-Handler, der das ForeignKey-Problem der ComboColumns ein für allemal abfrühstückt :D

    Beispiel User Raw View: (in meiner Version dlgUserRaw)
    DGV läuft auf "bsUser" - wird im Designer generiert, habe ich in meiner aktuellen Version umbenannt mit prefix "bs".
    Combobox für MitarbeiterID liest werte aus Tabelle Mitarbeiter (bsCbMitarbeiter)
    Displaymember = Mitarbeiter.expFullname (String)
    Valuemember = Mitarbeiter.ID (Int32)
    wird gespeichert in User.MitarbeiterID (Int32)
    Ja, das wundert mich auch, dass das manchmal klappte, wo es nach meim Verständnis eiglich nicht hätte dürfen.
    Aber mit dem neuen DataError-Handling ist das auch weg.



    Form-Gräuel
    (Das mit dem Switchen habich nicht verstanden.)
    Wie dem auch sei. So eine Zeile

    VB.NET-Quellcode

    1. Case "AdmDbMitarbeiter" : dlgMitarbeiterRaw.Show()
    ist syntaktischer Unfug.
    Weil dlgMitarbeiterRaw ist ein Datentyp - es ist kein Objekt (welches mit New aus einem Datentyp erstellt worden wäre).

    Mit meine Ucls ist gezeigt, wie's richtig geht:

    VB.NET-Quellcode

    1. Private Sub TV_main_NodeMouseDoubleClick(sender As Object, e As TreeNodeMouseClickEventArgs) Handles TV_main.NodeMouseDoubleClick
    2. Select Case e.Node.Name
    3. '...
    4. Case "AdmDbMitarbeiter" : SelectUcl(Of uclMitarbeiterRaw)() ' dlgMitarbeiterRaw.Show()
    5. '...
    6. End Select
    7. End Sub
    8. Private Sub SelectUcl(Of T As {UserControl, New})()
    9. Dim pnl = splMain.Panel2
    10. While pnl.Controls.Count > 0 : pnl.Controls(0).Dispose() : End While
    11. Dim ucl = New T ' mit New aus dem Datentyp ein Objekt erstellen
    12. ucl.Dock = DockStyle.Fill ' mit dem Objekt was tun
    13. Dts.Register(ucl)
    14. ControlStyling.StyleControls(ucl)
    15. pnl.Controls.Add(ucl)
    16. End Sub
    Ich hab übrigens in den Projekteinstellungen das Startform von frmMain auf Form1 umgestellt.
    Dateien

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Ja, das wundert mich auch, dass das manchmal klappte, wo es nach meim Verständnis eiglich nicht hätte dürfen.
    Aber mit dem neuen DataError-Handling ist das auch weg.

    Klappt sehr gut :) Wie gesagt, soweit war ich mit der Lektüre noch nicht.

    ErfinderDesRades schrieb:

    Form-Gräuel
    (Das mit dem Switchen habich nicht verstanden.)
    Wie dem auch sei. So eine Zeile

    MIt dem Switchen war gemeint, dass wenn ich den Tree ausblende, der vorher genutzte Platz vom Tree für das UCL freigegeben wird (Die UCL wird dann breiter dargestellt). Aber wie gesagt, ich bin eher für die Methode
    mit den Parent-Child-Forms (hatte dir ja einen Screen aus unserem WaWi eben angehangen, der das auch zeigt.

    ErfinderDesRades schrieb:

    ist syntaktischer Unfug.
    Weil dlgMitarbeiterRaw ist ein Datentyp - es ist kein Objekt (welches mit New aus einem Datentyp erstellt worden wäre).


    Wäre das hier der richtige Weg für OOP? Der Aufruf klappt zumindest auch damit.

    VB.NET-Quellcode

    1. Case "AdmDbMitarbeiter"
    2. Dim dlgMa As New dlgMitarbeiterRaw
    3. dlgMa.Show()
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Jo, stimmt.

    Und wenn du das zweimal machst, dann haste zwei dlgMitarbeiterRaw.



    Das mit dem Tree switchen kriegt man auch mit meim Ansatz hin, da liegt der Tree ja auf einem SplitterPanel. Da macht man SplitContainer.CollapsePanel1 (oder sowas ähnliches - grad vergessen), dann ist der TV auch weg.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    Jo, stimmt.

    Und wenn du das zweimal machst, dann haste zwei dlgMitarbeiterRaw.


    was genau meinst du mit 2x? Wäre der Aufruf denn so korrekt für eine Form?
    [line]​[/line]
    bei deiner Variante wüsste auch auch nicht, wie ich die BS vor dem Anzeigen des DGV filtern kann. Seh ich das richtig dass deine Styling-Klasse den 1. Eintrag der bs angreift, egal wie du gefiltert ist?

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: