C# Combobox aus Datenbank befüllen

n00del

Ensign
Registriert
Apr. 2013
Beiträge
204
Hallo,

bin momentan dabei eine kleine Anwendung in C# zu programmieren.
Hab noch nicht den allergrößten Durchblick, aber ich versuche es ala learning by doing.
Folgendes Problem habe ich:
Das Programm kennt eine Combobox, welche mit einem Select aus einer Tabelle namens "ort" befüllt wird.
Diese Combobox soll nur den Ortsnamen als Text haben, aber insgeheim wenn gewählt den Value wieder an die Datenbank übertragen.

Dafür gibt es diese Klasse:
Code:
 public class ComboboxItem
        {
            public string Text { get; set; }
            public object Value { get; set; }

            public override string ToString()
            {
                return Text;
            }
        }

Verwenden tue ich es wie folgt:
Code:
ComboboxItem item = new ComboboxItem();
                    item.Text = row["ort"].ToString();
                    item.Value = row["id"].ToString();
                    comboBox1.Items.Add(item);
                    comboBox1.SelectedIndex = 0;

Klappt auch alles soweit, jedoch möchte ich jetzt die gespeicherten Daten aus der Datenbank abrufen und die Datenbank kennt ja nur die id des Orts.

Wie schaffe ich es, dass die Combobox sich auf den richtigen Ort ändert anhand der id, die per Select aus der Datenbank.
 
"Wie schaffe ich es, dass die Combobox sich auf den richtigen Ort ändert anhand der id, die per Select aus der Datenbank." - erkläre das Bitte noch mal. Ich verstehe nicht, was Du genau möchtest.

Ich glaube, du möchtest sagen: Ich wähle etwas aus der ComboBox und möchte dann diese Daten aus der Datenbank laden?

Oder meinst Du was anders?

Noch etwas. Da du row["ort"] verwendest glaube ich, dass Du auf die Datenbank auch nicht mit einem Datencontext zugreift, sondern direkt per SQL Statement?

Was ist denn die "richtige ID", was erwartest Du?
 
n00del schrieb:
ich versuche es ala learning by doing
Mach das nicht, das geht schief, wie man sieht. Lies dich in das Thema Data Binding ein. Einzelne ComboBoxItems zu erstellen und diese dann der ComboBox hinzuzufügen macht man nicht. Binde einfach das was dir dein Select zurück gibt an die ComboBox und sag der ComboBox dann, dass du davon nur den Ort angezeigt haben möchtest.
 
  • Gefällt mir
Reaktionen: Raijin
Versuche es nochmal genauer zu erklären.

Ich habe eine combobox die aus einer Datenbankabfrage befüllt wird.
Code:
 public class ComboboxItem
        {
            public string Text { get; set; }
            public object Value { get; set; }

            public override string ToString()
            {
                return Text;
            }
        }

private void getort()
        {
            con.Open();
            string query = "SELECT id, ort from ort";
            MySqlDataReader row;
            row = con.ExecuteReader(query);
            if (row.HasRows)
            {
                while (row.Read())
                {
                    ComboboxItem item = new ComboboxItem();
                    item.Text = row["ort"].ToString();
                    item.Value = row["id"].ToString();
                    comboBox1.Items.Add(item);
                    comboBox1.SelectedIndex = 0;

                }
            }
        }

Diese Combobox zeigt Ort an, aber übermittelt die passende ID beim Absenden in eine andere Tabelle.
In dieser Auswertungstabelle steht also nur die ID des Ortes.

Jetzt habe ich eine Funktion, die diese Auswertungstabelle liest und die Daten in dem Formular befüllt.
Darunter auch die Combobox und diese soll sich dann weil sie die Ortsid(id) kennt auf den passenden Ort(ort) stellen.
 
Ich habe keinerlei Ahnung von C#, aber was dein Vorposter schreibt, klingt schon vernünftig. Sieh erstens zu, dass du das, was du aus der Datenbank bekommst, sauber auf ein Domänen-Objekt (wohl Ort mit ID und Name) mappst. Und dann sieh zu, dass du die Liste dieser Domänen-Objekte sauber als Datenmodell an die Combobox bindest. Irgendwo gibt's dann sicherlich irgendeinen Rendering-Mechanismus-Dingsbums, mit dem du definierst, was von deiner Domänenklasse deine einzelnen Comboitems an der Oberfläche anzeigen sollen. An deine andere Tabelle reichst du dann die an die Comboitems gebundenen Domänenobjekte weiter statt nur der IDs.

So würde ich es in unserer Java-Applikation machen. Wie gesagt: von C# habe ich keine Ahnung, aber ich bin sicher, dass das überall ähnlich ist.
 
Die ComboBox hat noch Eigenschaften und Events, ich denke Du brauchst SelectedItem/Index/value und SelectionChanged. Aber besser ist es wie gesagt per Binding, MVVM nimmt Dir da einiges ab. Musst Dich aber auch in ein paar neue Themen wie ViewModels und PropertyChanged einarbeiten. :)
 
Zurück
Oben