Einem Abfrageergebnis eine Zeile an erster Stelle hinzufügen

  • C#

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Einem Abfrageergebnis eine Zeile an erster Stelle hinzufügen

    Moin,
    ich hab schon wieder ein Problem.
    Ich hab eine ComboBox, die wird aus der Datenbank (per Dapper) gefüllt.

    C#-Quellcode

    1. private void cbBuchBereichFill()
    2. {
    3. using (IDbConnection connection = new MySqlConnection(ConnectionString))
    4. {
    5. cbBuchBereich.DataSource = connection.Query("sp_fBereicheSelectAll", commandType: CommandType.StoredProcedure).ToList();
    6. cbBuchBereich.DisplayMember = "Bezeichnung";
    7. cbBuchBereich.ValueMember = "ID";
    8. }
    9. }

    Soweit kein Problem. Ich brauch aber als erste Zeile sowas in der Art ID = 0, Bezeichnung = "-Wählen-". Die 0 (Null) brauch ich für eine weitere StoredProcedure, mit der ich dann eine Suche durchführen will (nach Bereich, Posten, von, bis). Es muss aber eben möglich sein, nicht alle Kriterien zu beachten, mit IF THEN ELSEIF in der Procedure kein Problem, ohne die Null hab ich aber keine Idee dazu.
    Ich hab hin und her sortiert, ich kriegs nicht hin. Kann mir jemand auf die Sprünge helfen?
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    immer wieder die Gretchenfrage: Video-Tut: Welchen Datentyp hat das Objekt?

    Wenn du weisst, welchen Datentyp der Ausdruck connection.Query("sp_fBereicheSelectAll", commandType: CommandType.StoredProcedure).ToList() erbringt, dann findest du blitzgeschwind, wie man in so einer Liste ein Element an einer bestimmten Position einfügt (engl: to insert).

    Also - sag an: Welchen Datentyp hat der Ausdruck connection.Query("sp_fBereicheSelectAll", commandType: CommandType.StoredProcedure).ToList()?
    Das ist eine Liste, darin enthalten sind INT (die ID) und string (die Bezeichnung).
    Ohne Dapper, also mit dem ganzen langen Kram für die Verbindung, die Query usw. weiß ich, wie es geht, aber hier krieg ich es nicht hin.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

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

    Was EdR lesen will, ist keine Beschreibung, sondern sowas: List(Of Integer), IEnumerable(Of String), MyClass(). Keines davon erfüllt zwar Deine Beschreibung, wäre aber eine Antwort, mit der sich EdR wohl zufrieden geben würde. Daher: neuer Versuch ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hm, ja, ok ... Wenn ich mit der Maus über das ToList() gehe, heißt es dort
    "Erstellt ein System.Collection.Generic.List<T> aus einem System.Collection.Generic.IEnumerable<out T>.
    Rückgabewerte: Ein System.Collection.Generic.List<T> Elemente aus der Eingabesequenz enthält.
    "
    Ich glaub, ich mach die Stelle ohne Dapper, das kann ich. Wäre zwar schöner bei einem System zu bleiben, aber ich muss weiterkommen, schönmachen kann ich es später.

    /edit
    So funktionierts:

    C#-Quellcode

    1. private void fillCBSearchBereich()
    2. {
    3. using (MySqlConnection sqlCon = new MySqlConnection(ConnectionString))
    4. {
    5. sqlCon.Open();
    6. MySqlDataAdapter sqllCmd = new MySqlDataAdapter("SELECT * FROM finanzbereiche ORDER BY Bezeichnung;", sqlCon);
    7. DataTable datatbl = new DataTable();
    8. sqllCmd.Fill(datatbl);
    9. cbSearchBereich.ValueMember = "ID";
    10. cbSearchBereich.DisplayMember = "Bezeichnung";
    11. DataRow topItem = datatbl.NewRow();
    12. topItem[0] = 0;
    13. topItem[1] = "-Wählen-";
    14. datatbl.Rows.InsertAt(topItem, 0);
    15. cbSearchBereich.DataSource = datatbl;
    16. sqlCon.Close();
    17. }
    18. }

    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de

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

    Schade. Du bist beim rot markierten Teil angekommen.
    Erwartet wurde aber als Antwort der grüne, um Dir weiterhelfen zu können.
    Bilder
    • Wanted.png

      15,36 kB, 612×252, 15 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Sowas steht da nicht, tut mir leid. Ich hab die Antwort darüber editiert, so funktioniert es. Schöner wäre aber trotzdem, wenn es auch mit Dapper gehen würde.

    /edit
    Es ist auch keine (Of Integer) oder (Of String). Die Liste enthält alle Spalten der Tabelle, INT für die ID, STRING für die Bezeichnung. Irgendwie versteh ich grad nicht wirklich, wie ich es anders erklären soll.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Ok, hab das Ganze mal in VB nachgestellt. Da kommt dann eine List(Of Object) raus. Dementsprechend müsstest Du zur Laufzeit ermitteln, von welchem Typ die Elemente sind und die List in eine typisierte List<Zielobjekttyp> casten, um dann einfacher weitermachen zu können. Wie sind denn die Listenelemente strukturiert? Vielleicht lässt sich so was herleiten. Screenshot eines Beispiels im Anhang. Mach mal bitte auch einen, dann kann man vielleicht was machen.
    Bilder
    • DebuggerHelp.png

      5,95 kB, 236×103, 49 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Es reicht sogar, zu wissen, das der Rückgabewert List<T> ist.
    Danach suchst du im ObjectBrowser, und findest da die Methode Insert(index, item).
    Womit deine Frage nach "an erster Stelle hinzufügen" doch beantwortet ist:

    VB.NET-Quellcode

    1. MyList.Insert(0, eineZeile)
    Zumindest theoretisch.
    Praktisch wirst du da ja nicht jedes x-beliebige Objekt inserten können, sondern eineZeile muss iwie son Dapper-Dings sein, sonst gibts später Theater, wenn eineZeile annere Properties hat als die übrigen DapperDinger in der Liste.
    Jedenfalls casten muss man zum Inserten nix, wenns wirklich eine List(Of Object) ist.

    Aber Hatori hat ja schon keine Lust mehr auf Dapper, oder fängt da jetzt an, einen hanebüchenen Mix von Vorgehensweisen zu implementieren... :S

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

    Gerade mal Dapper in ein Testprojekt geworfen und nachgebaut.

    Das Tolle daran ist, der Aufruf Query() hat einige Überladungen. Die Überladung die @Hatori nutzt reicht eine IEnumerable<dynamic>() zurück.

    Ich gehe davon aus, dass Dapper hier dynamische Objekte erzeugt, bei denen man nun .Spaltenname aufrufen kann, und dann entsprechende Werte zurückbekommt, jedoch ist das nicht wirklich von nutzen hier, da du nun, um diese Auflistung zu erweitern, du selbst ein solches Objekt erzeugen müsstest, was zwar theoretisch funktioniert, wenn du aber eh schon dabei bist, neue Klassen zu definieren, kannst du es auch richtig machen.

    Was bedeutet richtig? Generics!
    Was du brauchst sind Klassen, die die Rückgaben aus deiner Datenbank abbilden.
    Hier ein Beispiel:

    C#-Quellcode

    1. /// <summary>
    2. /// Reflects Table Maintenance in DB
    3. /// </summary>
    4. public class Maintenance
    5. {
    6. public int ID { get; set; }
    7. public string Name { get; set; }
    8. public string Location { get; set; }
    9. public DateTime Date { get; set; }
    10. public DateTime ToDoUntil { get; set; }
    11. }


    C#-Quellcode

    1. //Abfragen der Tabelle
    2. List<Maintenance> result = connection.Query<Maintenance>("sp_getMaintenances", commandType: CommandType.StoredProcedure).ToList();
    3. result.Insert(0, new Maintenance { ID = 0, Name = "- Bitte Wählen -" });


    Und schon hast du was du brauchst.
    SIMDoku (Simple Dokumentenverwaltung)
    Mein Lernprojekt um die verschiedensten Facetten der .NET Entwicklung zu erkunden.
    GitHub

    VB Paradise Dark Theme
    Inoffizieller VB-Paradise Discord.

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