DataTable und DataView



  • Mahlzeit,

    und wieder ein kleines Problem, wo ich mir nicht mehr zu helfen weiß.

    Mein Programm soll Messreihen auswerten. Dazu lese ich sie aus der Datei aus und erstelle daraus ein DataTable. Im weiteren wird damit gerechnet, was nur funktioniert, wenn die Datensätze absteigend nach der X-Spalte sortiert sind. Jetzt gibt es aber Dateien, wo die Messreihen aufsteigend bezüglich der X-Spalte hinterlegt sind. Lese ich diese jetzt ein, so bekomm ich im Verlauf meines Programmes einen Fehler. Also muss ich mein DataTable erst mal nach absteigenden X-Werten sortieren. Das geht aber nur mit einem entsprechenden DataView.

    Ich habe das auch schon hin bekommen, aber wie bekomme ich diese Sortierung jetzt wieder in die Tabelle übertragen? Ich sortiere ja nur die Ansicht der Tabelle, die Tabelle ist nach wie vor unverändert. Mit der Ansicht kann/will ich aber nicht weiterrechnen, da das Handling der Tabelle einfacher ist. Gibt es also eine Möglichkeit die sortierte Ansicht in ein DataTable zu exportieren oder die Sortierung zu übertragen?

    Gruß
    physici



  • Mir ist z.Z. keine Einfache Lösung bekannt... Du könntest aber z.B. die View in ein DataSet tun und dieses dann nach XML konvertieren und wieder in ein neues DataSet einlesen, wo Du dann die Tabelle wieder rausholen kannst...



  • Gibt es eine andere Möglichkeit, die Tabelle zu sortieren? Was passiert denn, wenn ich in einem DataGrid einen Spaltenkopf anklicke und die AllowSorting auf true ist? Dann wird doch das Grid sortiert. Ändert sich da auch nur die Ansicht oder wird die DataSource sortiert, so das ich diese rausziehen kann?



  • Die Tabelle ändert sich nie, wenn Du dort drin nicht explizit was änderst.



  • Okay, da das ja nicht so ohne weiteres funktioniert, habe ich mir mal einen kleinen Sortieralgorithmus zurecht gebastelt. Sortiert wird dabei nach der ersten Spalte ("X"):

    {
    	int zeilenZahl = myTable->Rows->get_Count()-1;
    	for (int i = 0; i < zeilenZahl; i++)
    	{
    		DataRow* myRow = myTable->Rows->get_Item(i);
    		double value = Convert::ToDouble(myRow->get_Item("X"));
    		for (int x = i+1; x <= zeilenZahl; x++)
    		{
    			DataRow* myCompareRow = myTable->Rows->get_Item(x);
    			double myCompareValue = Convert::ToDouble(myCompareRow->get_Item("X"));
    			if (myCompareValue > value)
    			{
    				int anzahlSpalten = myTable->Columns->get_Count()-1;
    				Object* myCompareArray[] = new Object*[anzahlSpalten+1];
    				for(int y = 0; y <= anzahlSpalten; y++)
    				{
    					myCompareArray[y]= myCompareRow->get_Item(y);
    				}
    				Object* myValueArray[] = new Object*[anzahlSpalten+1];
    				for(int y = 0; y <= anzahlSpalten; y++)
    				{
    					myValueArray[y]= myRow->get_Item(y);
    				}
    
    				myCompareRow->ItemArray = myValueArray;
    				myRow->ItemArray = myCompareArray;
    				i = i-1;
    				break;
    
    			}
    		}
    	}
    	return myTable;
    
    }
    

    Ist zwar bei sehr vielen Daten etwas zeitintensiv, aber was schnelleres habe ich nicht zu Stande gebracht. Müsste man wohl mit Perl machen und dann in C++ einbetten 🤡


Anmelden zum Antworten