Announcement

Collapse
No announcement yet.

DataGridview übernimmt Nachkommerstellen aus SQL Server, wie dies anpassen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • DataGridview übernimmt Nachkommerstellen aus SQL Server, wie dies anpassen?

    Hallo,
    ich habe ein Programm geschrieben, welches Daten aus einem SQL Server ausliesst ind einen DataTable speichert (inklusive FillSchema()) und dieser DataTable wird dann an ein DataGridView gebunden.

    Nun sind die Daten viele Zahlen und es treten vorwiegend diese beiden Datentypen in der Datenbank auf:
    numeric (18,2)
    numeric (18,3)

    Diese werden dann für das DataTable beim fill() scheinbar in System.Decimal kopiert. Und dann dementsprechend auch mit jeweils 2 oder 3 Nachkommerstellen im DataGridView angezeigt. Alles schick!

    ABER ich möchte jetzt, dass bei diesen Zahlen auch die Tausenderpunkte mit angezeigt werden. Im Prinzip auch kein Problem:

    DataGridViewColumn..........DefaultCellStyle.Forma t = "N"

    Wichtig, bevor Format spezifizieren ist der Format-String leer ("").

    Aber nun ist leider bei .Format = "N" der Standard mit nur 2 Nachkommerstellen.

    So nun wäre das auch kein Problem dieses auf 3 zu erweitern: .Format="N3".

    So aber ich will die ganze Sache automatisch abhandeln, d.h. ich muss unterscheiden, ob die jeweilige Spalte in meinem DataGridView nun zuallererst mit 2 oder 3 Nachkommerstellen aus der Datenbank gefüttert worden ist. Also halt wie es bisher immer anzeigt wird. Nun finde ich aber nirgend, wo das DataGridView speichert, dass es die aktuellen Daten nun mit 2 oder 3 Nachkommerstellen darstellt, wenn der .Format-String leer ist???

    Weiß jemand wie ich dieses Problem lösen kann?
    Bzw. hat jemand Ideen?

    Viele Grüße Chris

  • #2
    Hi Chris,

    wenn du alle Daten einer Spalte mit 3 Nachkommastellen und Tausenderpunkt darstellen willst verwende

    dataGridView1.Columns["<Spaltenname>"].DefaultCellStyle.Format = "N3";

    Ich verstehe nicht warum du unterscheiden willst ob standardmäßig mit 2 oder 3 Nachkommastellen dargestellt wird. Bitte erkläre dies.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hi gfoidl,
      danke für deinen Beitrag.

      Also es ist ganz einfach so. Die einen Zahlendaten sind Preise,d.h. 2 Nachkommerstellen und die anderen sind Messwerte,d.h. dort 3 Nachkommerstellen.

      Dies soll/muss halt so dargestellt werden.

      Zusätzlich soll halt der Tausenderpunkt auch dargestellt werden.

      Das mit .Format="N" bzw .Format="N2" oder .Format="N3" ist mir schon klar.

      Jedoch würde ich gerne wenn ich mein DataGridView befülle gerne die Anzeige bezüglich des Tausenderpunktes automatisch formatieren.
      Ich würde hier konkret versuchen mit einer FOREACH-Schleife die Columns zu durchlaufen und hier die .Format-Eigenschaft zu setzen. Aber um dies automatisiert zu machen, ohne feste Implementierung für jede einzelne Spalte, muss ich wissen mit wie vielen Nachkommerstellen das DataGridView gerade seine Daten anzeigen würde (Also so wie es bisher ohne Tausenderpunkt gemacht wird, mit den gewünschten Nachkommerstellen aus der DB), damit ich dann entweder .Format="N" oder .Format="N3" setzen kann.

      Hoffe es ist jetzt verständlich was ich möchte.

      Grüße Chris

      Comment


      • #4
        Hi Chris,

        die Messwerte und die Preise werden in zwei verschiedenen Spalten dargestellt - oder?

        Wenn diesem so ist werden aus dem DataTable die Spalten im DataGridView übernommen. Somit kann im DataGridView über die Columns-Eigenschaft direkt auf diese Spalten zugegriffen werden:
        Code:
        dataGridView1.Columns["Messwerte"].DefaultCellStyle.Format = "N3";
        dataGridView1.Columns["Preise"].DefaultCellStyle.Format = "N2";
        Für den Preis könnte auch die Währungseintellung ("C2") verwendet werden.

        mfG Gü
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hey gfoidl,
          danke für deine Mühe. Richtig es sind 2 Spalten. Bzw. es sind verschiedene Tabellen mit vielen Spalten wo diese oder ähnliche Spalten immer wieder vorkommen. Aber jede Spalte hat entweder 3 oder 2 Nachkommastellen.

          Aber ja, mir ist schon klar, wie ich die Format zuweise. Jedoch möchte ich halt die einzelenen Tabellenspalten rekursiv durchlaufen, damit ich jeweils die Formate für Tausenderpunkte mit 2 Nachkommastellen oder Tausenderpunkte mit 3 Nachkommastellen setzen kann.

          Mein Problem ist jetzt einfach, wenn ich meine DataTable an das DataGridView binde, ohne irgend etwas zu formatieren übernimmt er die korrekte Darstellung irgend wie aus der DB, also halt ob 2 oder 3 Nachkommerstellen, je nach DatenbankSpaltenTyp.

          Aber ich habe nicht herausgefunden, wo das DataGridView diese Information speichert, denn die .Format-Eigenschaft der einzelnen Spalten bleibt halt leer.

          Vielen Dank für die Hilfe
          Grüße Chris

          Comment


          • #6
            Hi,

            das DataGridView speichert diese Info nicht in einer Eigenschaft (die zugreifbar ist). Es werden - wie schon von dir erwähnt - die Werte aus der DB übernommen und diese aufgrund des Datentyps mit 2 od. 3 Nachkommastellen.

            Du kennst die Datenbank (bzw. die Abfrage die das Ergebnis liefert) und somit weißt du auch welche Spalten das sind. Somit kann das Format gesetzt werden.

            mfG Gü

            PS:
            Tabellenspalten rekursiv durchlaufen,
            stimmt nicht denn Rekursion kommt aus dem lateinischen und bedeutet "zurücklaufen". Gemeint ist wohl eher Iteration bzw. iterativ.
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Originally posted by gfoidl View Post
              PS:
              stimmt nicht denn Rekursion kommt aus dem lateinischen und bedeutet "zurücklaufen". Gemeint ist wohl eher Iteration bzw. iterativ.
              Da hast du allerdings recht!

              Ich kenne zwar alle Spalten und auch deren Namen etc und weiß auch wie die formatiert werden sollen. Aber es wäre extrem unschön jede Spalte einzeln und gezielt zu formatieren, denn es sind nicht gerade wenige. Und es macht Programmänderungen auch sehr umständlich.

              Gibt es keinen andern Weg dies herauszufinden?

              Comment


              • #8
                Hi,

                wenn es einfacher ist kann bereits in der SQL-Abfrage die Nachkommastellen festgelegt werden.

                Oder: Mittels Reflektion kann auf die Eigenschaften per String zugegriffen werden.

                Um dier hierzu ein Bsp. zu geben müsste ich allerdings mehr von deinem bisherigen Projekt wissen.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Originally posted by gfoidl View Post
                  Hi,

                  Oder: Mittels Reflektion kann auf die Eigenschaften per String zugegriffen werden.


                  mfG Gü

                  Hi gfoidl,

                  also ich habe es jetzt doch sozusagen "händisch" gelöst und den Spalten einzeln ihre Formate zugewiesen, auch aus dem Grund, dass ich die Header-Texte umformatieren muss.
                  Aber könntest du mir nur mal so aus Interesse das mit der Refekltion erklären?
                  Oder hast du vielleicht nen Link oder ein paar Schlagworte für Google?

                  Grüße Chris

                  Comment


                  • #10
                    Hallo,

                    ein einfaches Bsp zur Reflektion:
                    [highlight=c#]
                    public class Program
                    {
                    static void Main(string[] args)
                    {
                    // Instanz von A erstellen:
                    A a = new A();

                    // Typ der Instanz von A ermitteln:
                    Type t = a.GetType();

                    // Eigenschaft Wert von A holen:
                    PropertyInfo pi = t.GetProperty("Wert");

                    // Wert setzen (über Reflketion):
                    int i = 45;
                    pi.SetValue(a, i, null);

                    // Kontrollausgabe:
                    Console.WriteLine(a.Wert);

                    // Wert lesen (über Reflektion):
                    a.Wert = 32;
                    i = (int)pi.GetValue(a, null);
                    Console.WriteLine(i);

                    Console.ReadKey();
                    }
                    }

                    public class A
                    {
                    public int Wert { get; set; }
                    }
                    [/highlight]

                    Links:
                    http://msdn.microsoft.com/de-de/libr...83(VS.80).aspx
                    http://galileocomputing.de/openbook/.../kap31.htm#t27

                    Wie zu sehen kann mittels Reflektion auf Eigenschaften, Methoden, etc. eines Objekts mit dem Namen zugegriffen werden.
                    Somit kann über String-Operationen der Name zusammengebastelt werden und dann auf die entsprechende Eigenschaft, Methode zugegriffen werden.

                    Ermöglicht wird dies da in .net keine Sprungadressen in die Assemblies kompiliert werden sonder die Namen der Methoden, Eigenschaften.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Danke für deine Erläuterung und die Links. Habe ich mir schon einmal angesehen. Ist ganz Interessant, aber nun habe ich das Problem ja eh umgangen.

                      Grüße Chris

                      Comment

                      Working...
                      X