WinForm:Name von Listen einer Klasse als Einträge in Cmbx

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von nogood.

    WinForm:Name von Listen einer Klasse als Einträge in Cmbx

    Hi,

    ich bin dabei mir ein kleines Hilfsprogramm für meine Arbeit zu schreiben. Es sollen nach einem Verkauf diverse Dinge des Verkaufsvorgangs dokumentiert werden.
    Dazu hab ich mir mehrere Klassen angelegt z.B. Mitarbeiter.cs, Wohnort.cs, Kostenverteilung.cs. In den Klassen befindet sich fast immer eine ID und ein String. Diese Klassen werden dann in einer "übergeordneten" Klasse genutzt/eingebunden. Also, so was wie, Kauf.cs-Klasse inkl. Objekt von Mitarbeiter, Wohnort, Kostenverteilung etc.. Die eingebundenen Kassen werden in der übergeordneten Klasse (Kauf.cs) in generischen Listen "gesammelt" z.B. LstOfMitarbeiter, LstOf ...

    Diese Oberklasse lade/speichere ich dann als .json File (Serialisiere ich anhand der Oberklasse), um die Daten zu persistieren (DataSet only Lösung übersteigt noch mein Fähigkeiten).

    In einer extra SetupForm möchte ich gerne die Funktionalität realisieren, die diversen Listen der Oberklasse zu ändern/erweitern.
    Also neuen Mitarbeiternamen hinzufügen, ändern etc.. Kann ich eine Combobox programmieren, in der die Namen der diversen Listen der Oberklasse auftauchen und wenn man diese Item Selected dann der Listen Inhalt in einem DGV angezeigt wird.

    Geht so was ohne Magik String -> also eher so was foreach OfType (List<>) in Klasse-Kauf add to Cmbx Name of List?

    LG nogood

    ---------------
    DatenModel Bsp.:

    Kauf.cs
    ---------[ListOf<Mitarbeiter>
    ListOf<Wohnort>
    ...
    ]

    Mitarbeiter.cs
    -------[Guid ID
    string MitarbeiterName

    Konstructor
    [ MitabreiterName= mit arbeiterName
    ID = Guid.NewGuid()
    ]
    ]
    codewars.com Rank: 4 kyu
    @nogood Mach Dir eine gemeinsame Basisklasse für Deine Klassen mit den Properties ID und Name (falls das der String ist).
    Do kannst Du ganz easy von der übergeordneten Klasse auf diese Basisproperties zugreifen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Verstehe ich leider nicht?!
    Im Moment ist es so:
    Mitarbeiter.cs, Wohnort.cs, ...
    wobei z.B Mitarbeiter.cs -> ID und Name als Prop drin sind.

    Oberklasse:
    Kauf.cs mit :
    ListOfMitarbeiterObjs
    ListofWohnortObjs,...

    Was verbessert sich denn wenn ich nun
    Basis.cs
    Guid ID
    string Entry

    und dann
    Mitabeiter: Basis
    Wohnort:Basis

    und dann wieder Kauf.cs mit
    LstOfMitarbeiter
    LstOfWohnort
    ,....

    mache ist doch das Gleiche in grün ? Ich steh gerade auf dem Schlauch Sorry
    codewars.com Rank: 4 kyu
    Ja, das geht mit Reflection. Ein Beispiel, weil ich nämlich ebenfalls mit solchen DataContainer-Klassen arbeite und diese abspeichere:
    Du hast ein DGV, welches an eine BindingSource angebunden ist. Im ÜberContainer sind nur die Datenlisten, die Du anzeigen willst. Dann zum Testen:

    VB.NET-Quellcode

    1. Static Index As Integer = 0
    2. Dim Properties = DeinContainer.GetType.GetProperties()
    3. BindingSource1.DataSource = Properties(Index).GetValue(DeinContainer)
    4. DataGridView1.DataSource = BindingSource1 'kann man auch im Designer schon einstellen
    5. Index += 1

    So kann ich durch meine Listen durchsteppen und sie im DGV anzeigen lassen und bearbeiten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    nogood schrieb:

    In den Klassen befindet sich fast immer eine ID und ein String.
    Wenn Du auf Kauf.ID zugreifst, ist das was völlig anderes, als wenn Du auf Mitarbeiter.ID zugreifst.
    Mit der gemeinsamen Basisklasse kannst Du dann auf Basis.ID zugreifen, egal, ob das Kauf oder Mitarbeiter ist, das wäre dann identisch.
    Da lässt es sich welentlich eleganter mit den Instanzen hantieren, indem Du die Basisklasse als Parameter-Typ übergibst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. ​Public Partial Class FrmSetupLst
    2. Inherits Form
    3. Public Sub New()
    4. CenterToParent()
    5. InitializeComponent()
    6. //ComboBox mit String vorbelegen "Magic-Strings"
    7. For Each lst In ConfigAux.HGSetupLstObj.LstOfClassListsNames
    8. CmbxShowEditLst.Items.Add(lst)
    9. Next
    10. End Sub
    11. //Je nach auswahl des Strings wird dann die entsprechende Liste an das DGV gebunden
    12. Private Sub CmbxShowEditLst_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
    13. Select Case CmbxShowEditLst.SelectedItem
    14. Case "Mitarbeiter"
    15. DgvShowData.DataSource = ConfigAux.HGSetupLstObj.LstMitarbeiter
    16. Case "KundenWohnort"
    17. DgvShowData.DataSource = ConfigAux.HGSetupLstObj.LstKundenWohnort
    18. Case Else
    19. End Select
    20. End Sub
    21. End Class


    So geht alles wie ich es möchte. Ich denke, dass das so aber nicht gut gelöst ist. Da ja für später immer darauf geachtet werden muss, dass Select Case mit "Mitarbreiter" Hardgecoded irgendwo steht (ich meine gelesen zu haben das das ein sogenannter "Magic-String" wäre).

    @VaporiZed In meinen Worten nochmal "DeinContainer" wäre dann bei mir ein Objekt der Klasse Kauf.cs (in diesem Container wären die ListOfMitarbeiter ListOf Wohnort ...) Wie iteriere ich denn bei deinem BeispielCode durch? In was muss dein BeispielCode "gepackt" sein ein Foreach??

    @RodFromGermany Ich bin mir im unklaren ob ich mich richtig ausgedrückt habe -> Kauf.cs ist ja die OberKlasse,die die ganzen Listen beherbergt. Kauf.ID und Kauf.Name gibt es eben nicht. Sondern Kauf.ListOfMitarbeiter[0].Id, Kauf.ListOfMitarbeiter[0].Name ... ist dass dann immer noch eine LSg mit der BasisKlasse oder haben ich mich schlecht ausgedrückt?
    codewars.com Rank: 4 kyu

    nogood schrieb:

    Kauf.ID und Kauf.Name gibt es eben nicht.
    Dann edrsetze die Buchstabenfolge in meinem Post 5 durch z.B. Rumpelstilzchen oder einer anderen Klasse aus der Menge

    nogood schrieb:

    In den Klassen befindet sich fast immer eine ID und ein String.
    Dieser Dein Thread ist als C# markiert, Dein Snippet ist VB.NET mit C#-Kommentaren.
    Ja was denn nun?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das war ein Beispielcode, um von einer Liste von Kauf.cs zur nächsten zu wechseln. Das kannst Du z.B. in nen Button packen. Ich mach mal ein Beispielprojekt.

    ##########

    Und nochmal mit ner ListBox als Auswahlmöglichkeit
    Dateien
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.