Laden...

DataGridView mit Aray-Werten füllen

Erstellt von Delfis vor 6 Jahren Letzter Beitrag vor 6 Jahren 3.905 Views
D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren
DataGridView mit Aray-Werten füllen

Hallo C#-Nutzer,

ich versuche, die Werte aus einem eindimensionalen array (x_i) in ein DataGridView (koeff_dgv) zu übertragen. Folgendes habe ich probiert:


               koeff_dgv.Rows.Add(x_i);

In der ersten Zelle wird nur "System.Double[]" eingetragen


for (uint i=0; i<dimension; i++)
 {
         koeff_dgv.Rows.Add(x_i[i]);
 }

Es wird erwartungsgemäß die erste Spalte untereinander und nicht wie gewünscht die Zeile mit den array-Werten gefüllt.


for (uint i=0; i<dimension; i++)
 {
         koeff_dgv.Columns.Add(x_i[i]);
 }               

Erzeugt eine Fehlermeldung, dass "double nicht in System.Windows.Forms.DataGridViewColumn" umgewandelt werden kann.

Eine Suche bei den vorhandenen Forenthemen über "DataGridView array" blieb ohne entsprechendes Ergebnis. Daher meine Fragen:

Wie muss es richtig programmiert werden? Und wie müsste ich vorgehen, um ein zweidimensionales array entsprechend eintragen zu wollen?

Danke!

286 Beiträge seit 2011
vor 6 Jahren

Anstatt zu versuchen direkt in das DataGridView zu schreiben gehe lieber den Weg über die DataSource:


koeff_dgv.DataSource = x_i.Where(x => x>0).Select((x, index) =>
    new { RecNo = index + 1, ColumnName = x }).OrderByDescending(x => x.ColumnName).ToList();

Beste Grüße
emuuu

Edith: Anpassung

2+2=5( (für extrem große Werte von 2)

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo emuuu!

Wie kommt man auf so eine Programmzeile? Kann ich das in dem "openbook:Visual C#" irgendwo nachlesen?
Danke erst einmal für Deine Antwort, aber sie liefert leider nicht das gewünschte Ergebnis. Die Sortierung habe ich wieder herausgenommen, weil ich sie nicht brauche.
Am Ende des DataGrids werden zwei neue Spalten ergänzt, "RecNo" und "ColumnName", darunter die laufende Nummer und die Werte aus dem Feld.
Es sollte aber eine neue Zeile gefüllt werden, in der ersten Zelle eine noch festzulegende laufende Nummer, danach die array-Elemente. Wie muss das dann aussehen?

Danke!

286 Beiträge seit 2011
vor 6 Jahren

Wie kommt man auf so eine Programmzeile? => Erste Schritte mit LINQ in C#

Wen ich das richtig lese willst du anstatt eine Spalte mit mehreren Zeilen, eine Zeile mit mehreren Spalten?

Ist generell nicht der beste Ansatz, da "fortlaufende" Informationen eigentlich zeilenweise und "unterschiedliche" Informationen spaltenweise eingefügt werden sollten.
Wenn du also x Messungen hast die sich aus drei Messwerten zusammensetzen sollten die Spalten lauten x, Messwert_A, Messwert_B, Messwert_C und jede Zeile die Repräsentation eines Messwertes sein.
Da solltest du nochmal überdenken ob du es wirklich andersherum haben willst:


            double[] x_i = new double[] { 0.1, 0.2, 0.3 };
            DataTable dtResult = new DataTable("Auswertung");
            DataRow row = dtResult.NewRow();

            for (int i = 0; i < x_i.Length; i++)
            {
                dtResult.Columns.Add((i+1).ToString(), typeof(double));
                row[i] = x_i[i];
            }
            dtResult.Rows.Add(row);
            koeff_dgv.DataSource = dtResult;

Edit: In dem Beispiel wird jetzt dein Indexer in den Header der Spalte geschrieben. Wenn du tatsächlich zwei Zeilen haben willst musst du eine zweite Row hinzufügen, die Spalteninhalte müssen dann aber vom gleichen Typ (hier double) wie die Values in x_i sein (einer der Nachteile deines Ansatzes).

2+2=5( (für extrem große Werte von 2)

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo emuuu,

zu dem Hintergrund des Programms: Ich möchte zunächst zufällige lineare Gleichungssysteme erzeugen, um im nächsten Schritt die Genauigkeit von numerischen Verfahren zur Lösung dieser Gleichungssysteme zu testen. Die Koeffizientenmatrix setze ich derzeit zeilenweise zusammen, prinzipiell ist das genauso auch spaltenweise möglich. Zur Kontrolle sollen die Matrixelemente im DataGrid angezeigt werden.
Wegen der Zweidimensionalität hatte ich in meinem ersten Beitrag auch danach gefragt, wie man zweidimensionale Felder in ein DataGrid einfügen kann. Vielleicht hätte ich das gleich vorausschicken sollen.
Was empfiehlst Du mir nun:
Soll ich zunächst spaltenweise die Matrix und das DataGrid füllen oder macht es mehr Sinn, zunächst die Matrix zu füllen und damit anschließend das DataGrid? Wie sähe der Code dann in letzterem Fall aus?

So weit war ich übrigens in dem openbook noch nicht gekommen.

Danke!

286 Beiträge seit 2011
vor 6 Jahren

Die Koeffizientenmatrix setze ich derzeit zeilenweise zusammen, prinzipiell ist das genauso auch spaltenweise möglich.
Danke!

Das ist natürlich richtig. Meine Aussage zielte eher auf den Aufbau das DataGridView ab. Aber dies ist ja nur zum darstellen von Informationen. D.h. bezüglich deiner Frage:
Auf jeden Fall zuerst die Matrix befüllen und dann das Datagrid => Matrix ist deine Datenquelle, DataGrid ist nur eine "Anzeige" der Daten

Ich vermute mal du willst die L-R-Zerlegung machen?

2+2=5( (für extrem große Werte von 2)

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo emuuu,

Ok, das macht Sinn. Wie sieht denn dann der Programmcode aus, um ein zweidimensionales Feld in einem DataGrid darzustellen? Ich brauche ja nur in der ersten Zeile und Spalte eine Art "Überschrift z. B. a(i, j)" für die nachfolgenden Koeffizienten.

Die Householder-Transformation ist z. B. ein sehr gutes Verfahren zur Lösung linearer Gleichungssysteme.

Danke!

C
2.122 Beiträge seit 2010
vor 6 Jahren

Zeigt doch einem Neuling wenigstens die nachvollziehbare Übersetzung eines linq Statements 😉

286 Beiträge seit 2011
vor 6 Jahren

ch brauche ja nur in der ersten Zeile und Spalte eine Art "Überschrift z. B. a(i, j)" für die nachfolgenden Koeffizienten.

Wie von mir oben gepostet: Für jede x-Dimension der Matrix eine Column (Column.Add()) und für jede y-Dimension eine Row (.NewRow()).

Die Householder-Transformation ist z. B. ein sehr gutes Verfahren zur Lösung linearer Gleichungssysteme.

Gauß (LR-Zerlegung) ist doppelt so schnell wie Householder. Householder hat zwar eine höhere numerische Stabilität, das ist aber in den meisten Fällen den doppel so hohen Rechenaufwand nicht wert.

2+2=5( (für extrem große Werte von 2)

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo emuuu,

Danke, das werde ich ausprobieren.

Wie gesagt, soll das ein Testprogramm für numerische Verfahren werden. Das lässt sich dann ja feststellen, wie sich welches Verfahren verhält.

Gruß
Thomas

286 Beiträge seit 2011
vor 6 Jahren

Kein Thema ^^

Geht nur darum, dass ich mich hauptberuflich mit Solvern beschäftige und daher meinen Erfahrungswert mitteilen wollte.

Beste Grüße 😃
Timm

2+2=5( (für extrem große Werte von 2)

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo Timm,

das ist interessant. Für mich ist das eine Freizeitbeschäftigung. Ich würde gerne in der Softwareentwicklung tätig sein.

Gruß
Thomas

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo Timm,

es hakt noch immer. Ich kann keine neuen Spalten einfügen, weil mit dem zweiten Befehl "new" die bereits angezeigten Spalten gelöscht und durch die neuen ersetzt werden:


            koeff_dgv.DataSource = x_i.Where(x => x > 0).Select((x, index) =>
            new { Koeffizienten = "a("+(index+1) +", "+j+")", Überschrift = x }).ToList();

            koeff_dgv.DataSource = x_i.Where(x => x > 0).Select((x, index) =>
            new { Überschrift = x }).ToList();


Hier soll einfach nur eine weitere Spalte hinzugefügt werden. Ein Ersatz von "new" durch "add" führt zu einer Fehlermeldung. Wie muss es richtig heißen?

Und statt "Überschrift" in der ersten sowie folgenden Spalten hätte ich gerne die Darstellung x_i(i, j) mit i und j als aktuellem Zeilen- und Spaltenzähler so wie es in den Zeilen nun richtig dargestellt wird. Eine entsprechende Zusammensetzung wie bei "Koeffizienten" wird mit Fehlermeldungen quittiert. Auch hier die Frage: Wie muss es richtig heißen?

Danke!

C
2.122 Beiträge seit 2010
vor 6 Jahren

new durch add ersetzen kann nichts vernünftiges bringen. Was ist add für ein Schlüsselwort?
Mach dir doch zum ausprobieren ein simples Beispiel in dem man versteht was passieren soll. Linq ist kein solches 😉
Du weist zweimal eine DataSource zu, die zweite überschreibt die erste. Ist das das Problem?

Fehlermeldungen sind gut, sie sagen wo der Fehler ist. Lies sie.

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo chilic,

in dem DataGrid soll eine nn-Matrix spaltenweise zusammengesetzt werden. Insofern benötige ich nach der ersten Initialisierungszeile den entsprechenden Befehl, um weitere Spalten mit jeweils n Elementen ergänzen zu können, bis die nn-Matrix vollständig ist.

Danke!

286 Beiträge seit 2011
vor 6 Jahren

Du könntest auch etwas Eigeninitiative zeigen. In meinem zweiten Code-Post habe ich dir bereits die Lösung für dein Problem geliefert. Der Code setzt es zwar nicht exakt so um wie du es gerne hättest, allerdings sind dort und in der folgenden Erklärung alle nötigen Informationen und Snippets enthalten.

Hinzukommt, eine einzige Google-Suche führt direkt hier hin: 2-dimensional Integer array to DataGridView

Wie chilic schon angemerkt hat weißt du deinem DataGrid zweimal eine neue Source zu.
Anders ausgedrückt:


int i = 2;
i = 3;

Und beschwerst dich danach, dass i nicht mehr zwei ist.

2+2=5( (für extrem große Werte von 2)

D
Delfis Themenstarter:in
24 Beiträge seit 2017
vor 6 Jahren

Hallo Timm,

ich habe einiges getestet, bevor ich die Frage wieder eingestellt habe, wahrscheinlich stand ich auf dem Schlauch. Dein Google-Hinweis war nun hilfreich.

Danke!

Thomas