Laden...

DataTable | ColumnName Problem

Erstellt von shaun vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.387 Views
S
shaun Themenstarter:in
3 Beiträge seit 2016
vor 6 Jahren
DataTable | ColumnName Problem

Hallo zusammen,

mein Ziel ist es aus einer Liste von Artikeln eine 2d Matrix zu erstellen und
diese dann über eine DataTable / DataGrid zu visualisieren.

Dazu erstelle ich in einem Hintergrundthread ein object[][] und fülle dieses
mit Daten:

[0] "---------", "Artikel1","Artikel2","Artikel3", usw...
[1] "Artikel1", "---------","---------","---------", usw...
[2] "Artikel2", "---------","---------","---------", usw...
[3] "Artikel3", "---------","---------","---------", usw...

Daraus erstelle ich eine DataTable:


object[][] buffer = new object[Artikel.Count + 1][];

DataTable _myDataTable = new DataTable();
            
//create columns
for (int i = -1; i < Artikel.Count; i++)
    {
     if (i > -1) //Hier scheint der fehler zu liegen <---------------------------
           _myDataTable.Columns.Add(Artikel[i].Name);
     else
           _myDataTable.Columns.Add("optimale Reihe");
    }

//create rows
for (int rIndex = 0; rIndex < Artikel.Count; rIndex++)
    {
     var row = _myDataTable.NewRow();

     for (int cIndex = 0; cIndex < Artikel.Count+1; cIndex++)
         {
         if (cIndex == 0)
               row[cIndex] = ((ArtikelClass)buffer[rIndex + 1][cIndex]).Name;
         else
               row[cIndex] = buffer[rIndex + 1][cIndex];
         }

      _myDataTable.Rows.Add(row);
     }


Mein Problem ist im Bild (Dateianhang) zu sehen und wird scheinbar
durch folgende zeile verursacht:

Bild 1

 if (i > -1) //Hier scheint der fehler zu liegen <---------------------------
           _myDataTable.Columns.Add(Artikel[i].Name);

Bild2

 if (i > -1) //Hier scheint der fehler zu liegen <---------------------------
           _myDataTable.Columns.Add(Artikel[i].ID.ToString());

Habt ihr eine Idee dazu warum es zu den unterschiedlichen Ansichten
kommt ? Liegt der Fehler evtl. in den Name-Strings ? Unerlaubte Zeichen
oder so ?

T
461 Beiträge seit 2013
vor 6 Jahren

Hallo,

also mit DataBindings wäre alles einfacher, übersichtlicher und wesentlich sicherer das Ergebnis was du erwartest.

Das zusammenbasteln im Hintergrund hatte ich auch schon mal und kann mit gutem Gewissen sagen, daß DataBinding ums vielfache besser ist, glaube mir...

Zu deinem Fehler:
Daher du nur Bild1 Code (wie es aussieht) hergezeigt hast, kann man schwer den Unterschied ausmachen.

Deine Vermutung bringt hier nichts, da man aus den Informationen eben nicht vergleichen kann.

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

S
shaun Themenstarter:in
3 Beiträge seit 2016
vor 6 Jahren

Erstmal Danke für deine Antwort.

Der Code ist bei beiden Ausgaben gleich - bis auf die genannten Codezeilen:

linke Bildseite (Tabelle wird nur zum Teil befüllt)


if (i > -1) //Hier scheint der fehler zu liegen <---------------------------
           _myDataTable.Columns.Add(Artikel[i].Name);

rechte Bildseite


if (i > -1) //Hier scheint der fehler zu liegen <---------------------------
           _myDataTable.Columns.Add(Artikel[i].ID.ToString());

Bindings nutze ich grundsätzlich schon in Projekten - nur fällt mir bei diesem Szenario absolut kein Lösungsweg dazu ein. Ein Lösungsansatz in Stichpunkten würde mir reichen - wenn jemand einen parat hat.

D
985 Beiträge seit 2014
vor 6 Jahren

Es liegt auf jeden Fall an dem / (Slash) bzw. dem . in DataColumn.ColumnName.

Besser ist es, diese Bezeichnung in DataColumn.Caption zu schreiben und dann das DataGrid dazu zu bringen, diese Caption auch zu verwenden.

Dummerweise macht das DataGrid (wie auch das DataGridView bei WinForms) das nicht von selber. Da muss man dann nochmals Hand anlegen.

2.207 Beiträge seit 2011
vor 6 Jahren

Hallo shaun

Mein Problem ist im Bild (Dateianhang) zu sehen

Nein ist es nicht. Wir wissen nicht, was du erreichen willst oder was du erwartest. Kannst du bitte dein Problem in einem Satz zusammenfassen (wenn es geht unter 101 Zeichen), denn dann kannst du gleich dem Thread einen anständigen Titel geben 😉

Gruss

Coffeebean

T
461 Beiträge seit 2013
vor 6 Jahren

Es liegt auf jeden Fall an dem / (Slash) in DataColumn.ColumnName.

Also ich sehe im ColumnName keine Slashes? Sind ja nur in den DataRows oder täusch ich mich?

@shaun, weiß nicht ob das von Bedeutung ist aber auf den Bildern sind nicht nur die Daten anders, sondern auch der Kopf, zumindest von der Anzahl her...

Bis jetzt eigentlich nur Rätsel raten 😉

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

D
985 Beiträge seit 2014
vor 6 Jahren

Du hast insofern Recht, dass man es nicht sehen kann.

Aber wie hoch ist die Wahrscheinlichkeit, dass der TE für die Spaltentitel den Artikeltext gekürzt hat? Die geht gegen 0. Somit kann man davon ausgehen, dass die Spaltentitel gleich dem Text in der ersten Spalte einer jeden Zeile sind.

Somit befinden sich / und/oder . im ColumnName und das gibt dann die besagten Probleme (Werte in diesen Spalten werden nicht dargestellt).

Im ColumnName dürfen diese Zeichen nicht auftauchen, in der Caption ist es egal. Die Caption wird allerdings nicht von DataGrid verwendet (warum auch immer) und somit muss man dem mit ein wenig Code aufs Pferd helfen.

T
461 Beiträge seit 2013
vor 6 Jahren

Hallo,
diese Infos sind wirklich interessant, denn das wußte ich nicht. Aber wieder was dazugelernt! 👍

Dennoch würde ich gerne noch eine Alternative einbringen, nämlich, daß in den Columns keine \ sind, sondern einfach nur der zu lange Text zwar nicht String.Removed, sondern einfach visuell abgeschnitten werden, da es möglich sein kann, daß der Header eine fixe (Breite)Höhe hat. 😉

Was aber so oder so sinnlos ist darüber zu reden und Alternativen aufzustellen, solang sich der TE nicht gemeldet hat... 😁

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

D
985 Beiträge seit 2014
vor 6 Jahren

Du meinst also er hätte vor der Zuweisung den Wert noch gecleant?

Das würde dann bedeuten, dass dem TE das Problem bewusst ist und trotzdem die Frage hier stellt.

Halte ich für noch unwahrscheinlicher. 😁

T
461 Beiträge seit 2013
vor 6 Jahren

Ich denke wir reden aneinander vorbei 😁 , mal schauen was kommt.

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

S
shaun Themenstarter:in
3 Beiträge seit 2016
vor 6 Jahren

Hallo nochmal,

Row- und Columnheader waren tatsächlich in unterschiedlicher Anzahl vorhanden
was aber nur ein "Bastel-Problem" war. Und ja - die Columnheader hatten im Layout
eine fixe Höhe.

Auf jeden Fall habe ich wieder was über DataTables gelernt - was ja auch ganz
gut ist.

Auf jeden Fall habe das ganze jetzt mit Databindings gelöst und mein Ziel damit erreicht.
Manchmal ist die Lösung so nah:


for (int i = -1; i < Artikel.Count; i++)
            {
                var _column = new DataGridTextColumn();

                if (i < 0)
                {
                    _column.Header = null;
                    _column.Binding = new Binding("[0].Name");
                }

                else
                {
                    _column.Header = Artikel[i];
                    _column.Binding = new Binding("[" + (i + 1) + "].Value");
                }


                DG.Columns.Add(_column);
            }


var Rows
   = new ObservableCollection<object>();

for (int row = 1; row < buffer.Length; row++)
                Rows.Add(buffer[row]);
                        

DG.ItemsSource = Rows;