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 ?
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... 😄
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.
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.
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
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... 😄
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.
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.Remove
d, 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... 😄
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. 😁
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... 😄
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;