Zuallererst: Ich programmiere eine WindowsForms Anwendung im .net Framwork welche Daten auf einem SQL Server (unter Ubuntu Server) anzeigen und graphisch darstellen soll
Nun zu meinem Problem: Ich habe einen TableAdapter mit dem Namen COLUMNSTableAdapter erstellt, welcher mir alle Spaltennamen (bis auf eine) einer Tabelle ausgibt.
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE (TABLE_NAME = N'MQTT_Daten') AND (CHARACTER_SET_NAME <> 'Zeit')
Nun möchte ich für Visualisierungszwecke diese Ausgabe in eine Combobox überführen, mit der man dann auswählen kann welche der Spalten in einem Diagramm angezeigt werden sollen. Dafür habe ich den TableAdapter als Combobox per Drag and Drop in meine Form gezogen, sodass die entsprechenden Bindings erstellt werden und ich habe eine Methode "PupulateCombobox()" geschrieben. Sie sieht wie folgt aus:
private void PopulateCombobox()
{
DataTable Spalten = new DataTable();
BachelorDataSetTableAdapters.COLUMNSTableAdapter adapter = new BachelorDataSetTableAdapters.COLUMNSTableAdapter();
Spalten= adapter.GetData();
for (int i= 0; i < Spalten.Rows.Count; i++)
{
comboBox1.Items.Add(Spalten.Rows[i]);
}
}
Diese Funktion rufe ich innerhalb der Form1_Load Funktion auf.
Das ganze macht leider nicht das was es soll, sondern erzeugt das, was ihr im Anhang sehen könnt. Der erste Spaltenname "Temperatur" wird angezeigt, sowie 3 weitere Einträge (von der Anzahl her richtig). Allerdings stehen nun nicht die Spaltennamen da, sondern vier mal "Datenbanktool.BachelorDataSet+COLUMNSRow". Beim Debuggen steht allerdings im DataTable Spalten genau das drin was es soll (meine vier Spaltennamen).
Weiß jemand wo der Fehler liegt?
Vielen Dank und Liebe Grüße
Mit
Spalten.Rows[i]
greifst du auf die ganze Zeile zu, nicht auf ein einzelnes Element (der DataTable
) - verwende
Spalten.Rows[i][0]
Edit:
Oder noch schöner, s.a. Beispiel in DataRowCollection:
foreach (DataRow row in table.Rows)
{
comboBox.Items.Add(row[0]);
}
Und weil ich es gerade noch in deinem Code sehe (typischer Anfängerfehler):
DataTable Spalten = new DataTable();
// ...
Spalten = adapter.GetData();
Die Zuweisung "= new DataTable()
" ist überflüssig, da der Variablen ja gleich darauf wieder ein anderer Wert zugewiesen wird.
Und der Name Spalten
ist auch mißverständlich (und sollte dataTable
o.ä. heißen - und auch als lokale Variable mit einem Kleinbuchstaben anfangen). Vllt. hast du deswegen auch den Fehler nicht gesehen?
Am besten also
DataTable dataTable = adapter.GetData();
Daten haben in den UI Elementen nichts zu suchen.
Auch WindowsForms bietet DataBinding, das sollte auch hier benutzt werden.