Autor Beitrag
DonC
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 29.10.08 15:19 
Hi,

ich sitze nunmehr seit mehreren Stunden an einem Problem, was mich nahezu zur Verzweiflung treibt. Ich habe ein DataGridView, in dem ich eine Spalte mit Comboboxen in den Zellen habe (DataGridViewComboBoxCell). Die einzelnen Comboboxen möchte ich nun während der Laufzeit mit Werten füllen. Das besondere dabei: Es soll sich dabei um Key-Value-Einträge handeln, d.h. zu dem für den User in der Kombobox angezeigten Eintrag gibt es im Hintergrund noch einen Key. Um das zu realisieren, benutze ich folgende Klasse:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public class Option
    {
        public Option(String id, String value)
        {
            this.id = id;
            this.value = value;
        }

        public string id;
        public string value;

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

Mit folgendem Code fülle ich nun beispielsweise eine Combobox im DataGridView:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
DataGridViewComboBoxCell combo = (DataGridViewComboBoxCell)dgv_test[0,8];

foreach (Option option in attributes)
{
     combo.Items.Add(new Option(option.id.ToString(), option.value.ToString()));
}


Soweit, so gut. Die Einträge werden beim starten des Programms einwandfrei in den Comboboxen angezeigt.

Nun aber das Problem:

Wenn ich einen Eintrag in der Combobox auswähle und ich dann die Zelle verlasse, bekomme ich die Fehlermeldung "Der Wert in der Combobox ist ungültig." Der Fehler ist vom Typ "DataError" und wenn ich mir beim entsprechenden Ereignis den Context ausgeben lasse, steht dort "Formatting / Display".

Ich habe nun schon ewig nach einer Lösung gesucht, aber bisher nichts gefunden. Weiss jemand von Euch, wie man den Fehler beseitigt bzw. in einer DataGridView-Combobox Werte mit Key und Value speichern kann?

Wenn ich die Combobox beispielsweise lediglich mit

ausblenden C#-Quelltext
1:
2:
3:
4:
foreach (Option option in attributes)
{
     combo.Items.Add(option.value.ToString());
}


fülle, d.h. nur mit einem einzelnen String, dann kommt der Fehler nicht. Nur ich brauche halt dringend noch den dazugehörigen Key, welchen ich dann später auslesen kann.

Wäre super, wenn mir jemand helfen könnte.

Übrigens: Bei normalen Comboboxen, welche sich nicht in einem DataGridView befinden, funktioniert die Option-Klasse einwandfrei.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 29.10.08 16:09 
Hallo,

ich benutze dies bisher eigentlich nur mit DataTables. Aber es müsste auch mit Deinem Verfahren gehen:
  • Erstelle eine List<Option> als Quelle. Falsch, es muss heißen:
  • Erstelle eine BindingList<Option> als Quelle.
  • Erstelle eine DataGridViewComboBoxColumn (Column, nicht einzelne Cells!).
  • Ordne DataSource, DisplayMember, ValueMember an die List<Option> sowie Key/Value.
  • Lege DataPropertyName gesondert fest auf das Feld der eigentlichen Datenquelle.

Das Verfahren mit dem Festlegen einer einzelnen DGV-Zelle klappt in der Regel nicht: Das DGV wird von NET als ein Gesamt-Control behandelt; eine einzelne Zelle wird nur im Edit-Modus separat benutzt. Dazu muss ggf. das EditingControlShowing-Ereignis verwendet werden.

Im übrigen kannst Du Dich an meinem Verfahren unter DataGridView: Master/Detail über ComboBox orientieren.

Ich hoffe außerdem, dass Du die Daten nicht direkt in das DGV schreibst, sondern eine Datenquelle benutzt.

Schließlich solltest Du die Option-Klasse überarbeiten: Etwas, was als ID verwendet wird, sollte immer ein numerischer Wert sein; bei einem String solltest du es anders nennen (z.B. key). Du solltest trennen zwischen den internen Variablen (kleingeschrieben) und den public-Eigenschaften (großer Anfangsbuchstabe).

Gruß Jürgen


Zuletzt bearbeitet von JüTho am Fr 31.10.08 10:27, insgesamt 1-mal bearbeitet
DonC Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 29.10.08 17:19 
Hi Jürgen,

erst einmal vielen Dank für Deine Antwort. Das Problem ist jedoch, dass wenn man die DataSource für die gesamte Spalte angibt, man nicht für die einzelnen ComboBox-Zellen verschiedene DropDown-Werte hat. Dies muss aber bei mir möglich sein.
Ich habe mittlerweile eine andere Lösung gefunden. Ich habe mir eine DataTable erstellt, welche jeweils die DropDown-Werte für die einzelnen ComboBoxen enthält. Für die einzelnen DataGridViewComboBoxCell-Objekte lege ich dann die DataSource, Value- und Display-Member-Eigenschaften fest. Über die Value-Eigenschaft wird der vorselektierte Wert festgelegt. Das funktioniert soweit ganz gut. Ist sicherlich nicht die eleganteste Lösung, aber zumindest funktioniert es erst einmal.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 31.10.08 10:26 
Hallo,

damit hier nichts Falsches stehen bleibt, muss ich mich selbst korrigieren: Eine List<T> genügt nicht, sondern es muss eine BindingList<T> sein. Im übrigen sollte es "irgendwie" klappen; aber die DataTable ist aus Sicht der DGV-ComboBox natürlich eine brauchbare Lösung.

Jürgen