Mapping von DB Werten in einem DataGrid



  • Huhu,

    also ich habe mir per Assistent (VS.net 2003) eine, Datenbank Verbindung zu einer Oracle Datenbank angelegt. Diese werden über den OracleAdapter in ein DataSet gefüllt und das ganze wird per Datagrid Visualisiert.

    Mein Problem ist folgendes:
    In meiner Datenbank stehen numerische IDs, diese IDs werden auch numerisch im Datagrid angezeigt. Was Natürlich unschön ist, da kein Mensch der die IDs nicht auswendig etwas damit anfangen kann.

    Also müsste ich diese IDs auf einen String mappen, Beispiel:

    1 -> Kunde
    2 -> Mitarbeiter
    3 -> Irgendwer

    Meine frage, bringt das Datagrid schon von Haus aus eine Funktion mit, womit ich diesen Mapping Vorgang erledigen kann?
    Gibt es vielleicht eine andere Componenten die diese Aufgabe für mich erledigen könnte oder muss ich dort selbst Handanlegen??

    gruß! Sieben!



  • Also wenn ich Dich richtig verstanden habe, hat man folgende Möglichkeiten:

    man kann eine Spalte über einem nummerischen Index erreichen etwa so

    ... .Column(1);
    

    als auch über den Spaltennamen sprich den Feldnamen der beim erstellen
    er Tabelle verwand wurde, etwa so

    ... .Column("Mitarbeiter");
    

    genauso kannst du weil ein Dataset mehrere Tabellen enthalten kann eine Tabelle
    über einen numerischen Index erreichen als auch über deren Namen den Du kennst
    wenn Du die DB entworfen hastetwa so:

    DataGrid1.Table(0);
    //oder
    DataGrid1.Table("Kunden")
    // 0 -> "Kunden"
    

    Hoffe ich habe mich jetzt oben nicht vertippt, aber um Dir ne Idee rüberzubringen sollte es gehn! Der Code oben ist zwar nicht sinnvoll, aber es soll Dir zeigen welche Möglichekeiten Du hast um die Übergabeparameter zu wählen beim Datagrid.

    Wenn man eine Datenbank anspricht die man nicht kennt kann man trotzdem ein DataSet füllen weil einem das DataSet Methoden und Eigenschaften zur Verfügung
    stellt um Information über den Aufbau einer DB zu erhalten!

    Guck halt ma in der MSDN zum DataGrid nach ist sehr interresannt.
    die Intellisens - Technik (die intelligent Codeersetzung zeigt Dir auf was Du an einer Stelle alles einsetzen kannst) )gibt auch viel wissenswertes preis zu den Möglichkeiten was ein Objekt hat also in deinem konkreten Fall meine ich damit das DataGrid

    mfg sclearscreen 🙂



  • Huhu,

    hm... nee nicht ganz. Also es geht mir nicht darum irgendwelche Werte anzusprechen die aus der Datenbank kommen. Ebensowenig, sollen Werte im DataSet hinzugefügt bzw Verändert werden.

    Nehmen wir einmal an, wir haben eine Tabelle "Konto", dort gibt es eine Spalte "Währung" die Werte in Form von Integer speichert. Die Datenbank kennt also den String der hinter einer Integer ID steckt nicht! Jetzt bekomme ich mein DataSet mit den Tabellen und Spalten hoch geliefert. Das Datagrid zeigt mir auch wunderschön meine Tabelle mit allen spalten an.
    Was nun unschön ist, ist das in meinem Datagrid in der Spalte "Währung" nur Integer-Werte stehen, womit man als Mensch aber leider nichts Anfangen kann, oder kennt ihr ne Währung 1?? Jetzt will ich eine Möglichkeit haben, diese 1 im Datagrid durch "Euro" oder bei 2 durch "Dollar" zu ersetzen ohne das die Werte im Dataset verändern werden, da ich diese für spätere Entscheidungen als Integer Werte benötige.

    Das Datagrid muss also eine Möglichkeit besitzen numerische Werte die von der Datenbank kommen in sinnvolle Strings umzuwandeln. Meine Frage ist, ob dies schon jemand gemacht hat, bzw weiß was ich dort genau überschreiben muss.

    Hier mal eine Skizze wie ich das meine...
    http://www.necnet.de/neo/ronny/datagrid.jpg

    gruß! Sieben!



  • hmm also ichgehe mal davon aus das Du die DataSource - Egenschaft des DataGrid - Objektes schon zur Entwurfszeit gesetzt hast ( dadurch hast du ein typisiertes DataSet - Objekt) und weil Du bestimmt auch über den OleDbAdapter über die Funktion "DataSet genierieren rangekommen bist!
    Das würde schonmal nicht gehen, weil Du denke ich in jedem Fall

    Erstmal die Daten holen musst
    dann die Tabelle im DataGrid ähm DataSet entsprechend ändern musst

    um jetzt erst im nachhinein die DataSource - Eigenschaft zu belegen.
    Ich würde an dieser Stelle auf Nichttypisiertes DataSet ausweichen
    weil es dann vermutlich keine Probleme gibt die durch das nachträgliche manipulieren auftreten könnten (Stichwort Ausnahmen usw.).

    Man kommt da wahrscheinlich nicht drumrum selbst Hand anzulegen, meine ich.
    Kann dazu jetzt weiter nichts sagen weil ich noch nicht so ne Problemstellung hatte.

    mfg sclearscreen 🙂



  • hmm hätte jetzt noch ne Idee ich weiss jetzt aber nicht aus dem Stehgreif ob das von SQL understützt wird!

    um irgend ne Abfrage zu machen hat man ja das ominöse SELECT .... FROM ...
    wenn man hier schon etwas einbauen könnte als PseudoCodetechnisch:

    Wenn Zelle diesen Wert dann gib das Ergenis der Abfrage so zurück ich hoffe ich konnte mich irgendwie verständlich machen?

    mfg sclearscreen



  • hm... ja ich habe ein Typisiertes Dataset, das über ein OracleAdapter gefüllt wird.

    Wir wollen so wenig wie möglich Datenbankseitig machen, deshalb würde so ein Select Join Konstrukt schon einmal wegfallen...

    Irgendwie kann ich nicht glauben das sowas nicht geht...
    Was macht man denn wenn man verschiedene Sprachen hat, und man von der Datenbank nur eine ID bekommt und das Frontend aufgrund der vorher gewälten Sprache das entsprechende Label anzeigt. Man kann doch nicht für jede Sprache ne eigene Datenbank bzw eigene Tabellen anlegen...

    Weiterhin sollen die Daten im Dataset nicht verändert werden, da man für spätere Funktionalitäten unbedingt ein Integer Wert braucht.

    Die frage für mich ist, wie zeigt das Datagrid die Werte an. Zieht es die Werte direkt aus dem Datasheet oder kopiert bzw macht sich ne Reference auf den Wert vor der Anzeige?

    Im Prinzip müsste ich ja einfach nur die Funktion überschreiben, mit der das Datagrid den Wert zur Anzeige bringt, bzw mit der das Datagrid den Wert aus dem Datasheet holz. Dann könnte man eine switch Abfrage machen und das ganze auf mein String mappen. Nur weiß ich leider nicht welche Funktion des Datagrids dafür zuständig ist 😞

    gruß! Sieben!



  • Sieben schrieb:

    hm... ja ich habe ein Typisiertes Dataset, das über ein OracleAdapter gefüllt wird.

    Wir wollen so wenig wie möglich Datenbankseitig machen, deshalb würde so ein Select Join Konstrukt schon einmal wegfallen...

    Irgendwie kann ich nicht glauben das sowas nicht geht...
    Was macht man denn wenn man verschiedene Sprachen hat, und man von der Datenbank nur eine ID bekommt und das Frontend aufgrund der vorher gewälten Sprache das entsprechende Label anzeigt. Man kann doch nicht für jede Sprache ne eigene Datenbank bzw eigene Tabellen anlegen...

    Weiterhin sollen die Daten im Dataset nicht verändert werden, da man für spätere Funktionalitäten unbedingt ein Integer Wert braucht.

    Die frage für mich ist, wie zeigt das Datagrid die Werte an. Zieht es die Werte direkt aus dem Datasheet oder kopiert bzw macht sich ne Reference auf den Wert vor der Anzeige?

    Im Prinzip müsste ich ja einfach nur die Funktion überschreiben, mit der das Datagrid den Wert zur Anzeige bringt, bzw mit der das Datagrid den Wert aus dem Datasheet holz. Dann könnte man eine switch Abfrage machen und das ganze auf mein String mappen. Nur weiß ich leider nicht welche Funktion des Datagrids dafür zuständig ist 😞

    gruß! Sieben!

    Warum arbeitest Du nicht mit 2 Datasets? 1 nes wo Du die Daten aus der Oracle -DB rausziehst, das 2 generierst Du aus dem ersten und diese nimmst Du um die Daten zu manipulieren! Erzeuge aber das 2. Dataset aber als Kopie weil im .NET
    ja bekanntlich zumeist bei komplexen Datenobjekten mit ner Referenz gearbeitet
    wird. Und ne Referenz bedeute ne Änderung in ner Referenz bedeutet gleichzeitig ne Manipulation des Original! Um ne konkrete Kopie zu erzeugen gibts die Methode

    ... .Clone();
    

    Das stellt dann sicher das Du dort ruhig hacken kannst ohne das Original zu beeinflussen!
    Stelle aber sicher das wenn mit dem ersten Dataset was Datenbankmässig angestellt wird auch immer wieder ein Klon von dem ersten DataSet gebildet wird mit dem konkret auch wieder manipuliert wird, also dessen internen
    Daten!

    Dieses 2. DataSet was dann unseren geklonten Objekt entspricht kannst du dann
    deine konkreten Werte umwrappen
    Diesen ominösen Klon sprich das 2. DataSet kannst Du dann auch in der DataSource - Eigenschaft des DataGrids zuweisen! Sollte dann eigentlich unproblematisch sein! Musst aber bei jeder Datenbanktransaktion beide DatSets
    behandeln!

    Hoffe ich konnte Dir also meine Idee gut vermitteln!? 💡

    mfg sclearscreen 🙂



  • Die komplizierter Variante wäre an dieser Stelle bestimmt nicht die schlechteste
    aber ne Spezialisierte Klasse vom DataSet zu bilden wäre aber bei deiner Aufgabe den doch zuviel Aufwand, würde ich meinen!

    mfg sclearscreen 😉



  • Und Aufpassen das geklonte DataSet immer erst erzeugen nachdem das Original
    durch ne Transaktion auch gefüllt ist

    // Den Klon ans DataGrid vermitteln
    DataSet KlonDataSetZumUmWrappenDerWerte;
    
    oleDbAdapter.Fill(OriginalDatasetWasNichtManipuliertWerdenSoll);
    
    KlonDataSetZumUmWrappenDerWerte = OriginalDatasetWasNichtManipuliertWerdenSoll.Clone();
    
    // Jetzt Werte im Klon manipulieren
    

    Nun sollte meine Idee deutlichere züge angenommen haben



  • der Vorteil liegt nun auf der Hand:

    Mit dem 1. DataSet hast Du immernoch die unbedingt benötigten Integer zur
    internen Verarbeitung

    Und das 2. DataSet wird als kopie direkt immer auf das 1. DataSet abgebildet
    (geklont) um die doofen Zahlen umzuwrappen um damit besser zum User Daten nach aussen übers GUI abzubilden.

    Wichtig ist nur sobald ne Transaktion das 1. DataSet betrifft sollte auch neu geklont werden um die Beziehung zwischen den 2 DataSet aufrechtzuerhalten, weil
    ja beide dieselbe DB abbilden sollen in deinem Programm.

    So jetzt fülle ich mich sicher das Du dich vielleicht wohler fühlst? Oder?

    mfg sclearscreen


Anmelden zum Antworten