Laden...

Comboboxen in datengebundenes DataGridView einfügen

Erstellt von Andy.C vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.304 Views
Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren
Comboboxen in datengebundenes DataGridView einfügen

Guten Morgen,

Ich habe hier ein dataGRidView Steuerelement, gebunden an DataSet, DataTable usw.
Die Daten selbst kommen aus einer List.
Da die meisten FElder vom Typ int oder String gewesen sind, hatte ich bisher keine Probleme, jetzt geht es darum eine ComboBox einzufügen.
Wenn ich die Columns selber mit der Hand Fest Definiere, so bekomme ich das gewollte hin.

Nun habe ich hier jedoch ein DataSet welches das Chema aufbaut.

DataSet ds = new DataSet();

DataTable kontakte= ds.Tables.Add("Kontakte");
DataColumn k_id = kontakte.Columns.Add("k_id", typeof(int));
kontakte.Columns.Add("Status", typeof(Hier sollt die Combobox ihren Platz finden));
kontakte.Columns.Add("Name", typeof(string));
kontakte.Columns.Add("Telefon", typeof(string));
kontakte.Columns.Add("Stadt", typeof(string));
kontakte.Columns.Add("Land", typeof(string));

Was auch immer ich bei Status einfüge für ein Typ, so bekomme ich entweder ne Exception, was Logisch ist, oder der Zeig mir Kackdreist den Typ in form eines Strings an.

Jemand eine Lösung für mich Parat?

Danke
Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

J
40 Beiträge seit 2007
vor 15 Jahren

Guten morgen

kannst doch einfach auf der DataGridView im Designer die entsprechende Spalte mit ColumsType = DataGridViewComboBoxColumn setzen und somit sollte es schon funktionieren.

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Wenn dein Grid gebunden ist an DataSet, DataTable usw., kommen die Daten aus einer Datatable, nicht aus einer List.

Ich finde, das ganze Brimborium zu konfigurieren, machen die IDE-Assistenten und -Designer viel einfacher und sicherer (Alle GridColumns, DataTables und DBCommands müssen ja für jede Spalte jeder Tabelle 100%ig aufeinander und auf die Datenbank abgestimmt sein, das ist richtig viel!), und am Ende hat man typisierte DataRows, mit denen man vergleichbar komfortabel proggen kann wie mit 'ner Objekt-DB.
Eigenartigerweise ist ziemlich unbekannt, wie man mit Assi und Designer eine DB-Anwendung im Groben "zusammenkloppt" (einige Nacharbeit bleibt).
Kannst dir mal "Datenbank in 10 Minuten" angucken, das konfiguriert eine kleine DB-Anwendung. Und in "MasterDetailView" wird dann auf der Basis eine ComboColumn in ein Grid eingebaut. Auf http://home.arcor.de/eckardahlers/Downloadpage/index.html. ist zwar VB, aber die Designer sind ja dieselben.

Der frühe Apfel fängt den Wurm.

J
3.331 Beiträge seit 2006
vor 15 Jahren

Hallo,

**DataGridViewComboBoxColumn **halte ich auch für die sinnvollste Lösung. Dazu solltest Du eine weitere **DataTable **status in das DataSet einfügen mit den Feldern ID, Text und den möglichen Werten; zwischen status.ID und kontakte.status wird eine DataRelation (= ForeignKey) eingerichtet.

Der ComboBox-Column weist Du dann die Tabelle status zu bei DataSource, ValueMember, DisplayMember und verknüpft sie über DataPropertyName.

Jürgen

@ErfinderDesRades
Ich finde, die IDE-Assistenten verhindern oft, dass sich das Verständnis für die Zusammenhänge entwickelt; und es geht nicht unbedingt schneller.

5.299 Beiträge seit 2008
vor 15 Jahren

... und es geht nicht unbedingt schneller. Oh, doch. Erheblich.

Ich finde, die IDE-Assistenten verhindern oft, dass sich das Verständnis für die Zusammenhänge entwickelt... Da ist was dran, da muß man sich bemühen.
"Ok, funzt, wie und warum ist egal" - ist eine Herangehensweise von nur geringer Reichweite.
Aber bemühen muß man sich auf beiden Wegen.
Das meiste über die Zusammenhänge was ich gelernt hab, habich gelernt, indem ich dann viel im DesignerCode herumgeguckt hab.
Das findich halt gut zu lernen, weil da hat man erstmal eine Vorlage, die schonmal läuft.
Die Vorlage ist im einzelnen zwar ziemlich grauenhaft gecodet, aber das Gesamt-Design ist durchaus tauglich und erweiterungsfähig.

Der frühe Apfel fängt den Wurm.

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren

Hallo ErfinderDesRades, der Link ist tot, die Seite kann nicht gefunden werden.

juetho, DataGridViewComboBoxColumn hatte ich auch schon, wie gesagt er kloppt mir da janz blöde nur einen String rein. Gibt es ein Anschauungsobjekt zum Besseren verständnis?

Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

J
3.331 Beiträge seit 2006
vor 15 Jahren

Gibt es ein Anschauungsobjekt zum Besseren verständnis?

Siehe DataGridView: Master/Detail über ComboBox. Du darfst aber die zweite DataTable mit den Nachschlagewerten nicht vergessen.

Jürgen

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren

Hi,

dieses thema hatte ich auch schon gefunden.
Grid.Columns.Insert(i1, combo); nimmt er nicht, er sagt mir dort das würde nicht gehen, da dieses Steuerelement Datengebunden sei.

Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

J
3.331 Beiträge seit 2006
vor 15 Jahren

Hallo Andy,

tut mir leid, dazu kann ich so nichts sagen. Selbstverständlich sind das DataGridView und die ComboBoxColumn bei meiner Lösung datengebunden, und so funktioniert es auch.

Ich befürchte, Du musst bei diesem Versuch etwas mehr Code zeigen. Jürgen

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren

Na es sieht jetzt so aus, dass ich die Column, wie in dem Thema von dir, auch entferne, eine DataGridViewComboBoxColumn einfüge.
Sie wird sogar Angezeigt.

Nur folgendes verursacht Probleme

combo.DataPropertyName = "Status";

Kommentiere ich dieses aus, läuft es, die ComboBox hat jedoch keinen Inhalt, ist also Datenleer. Wenn ich es jedoch nicht Auskommentiere, sind Daten enthalten, bekomme jedoch bei jedem Überfahren mit der Maus, oder Neuzeichen der DataGridView eine Exception.

Der DataGridViewComboBoxCell-Wert ist ungültig.

Man da is ne Schwere Geburt 🤔

Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

J
3.331 Beiträge seit 2006
vor 15 Jahren

Wir kommen der Sache näher. Wie heißt die Exception genau? Von welchem Typ ist die Spalte Status in der Tabelle kontakte? Hast Du die Tabelle status exakt gleich definiert? Ist es möglich, eine ComboBoxCell zu aktivieren und/oder das SelectedItem zu ändern, oder kommt dabei ebenfalls eine Exception?

Jürgen

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren

Inhalt selbst sollte String sein.
Status (Aktiv, Inaktiv, Abgelehnt) usw.
Einen anderen wert kann ich nicht auswählen, schon beim Überfahren gibt es eine Exception.

DataGRidView Ausnahme:
System.ArgumentException: Der DataGridViewComboBoxCell-Wert ist ungültig.

Ich habe nun auch für den DataSource der CpmboBox ein ArrayList, List<string> sowie ein DataSource Objekt probiert.

Hast Du die Tabelle status exakt gleich definiert

Was meinst du konkret?

Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

J
3.331 Beiträge seit 2006
vor 15 Jahren

Ach je, dann passt "meine" Lösung mit der DataGridViewComboBoxColumn so überhaupt nicht; ich gehe davon aus, dass eine zweite DataTable die Nachschlagewerte enthält. (Das meinte ich mit dem Hinweis auf die Tabelle status.)

Mit List<string> als DataSource sollte es direkt funktionieren; aber ich weiß nicht, wie dann DisplayMember und ValueMember zu verwenden sind. Die Forumssuche nach datagridview list könnte weiterführen; ich habe jetzt aber nicht untersucht, welche der Diskussionen am besten passen.

Jürgen

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren

Nein ich habe keine weitere Tabelle als Querverweise o.ä.
Daher ist DataPropertyName für mich so unlogisch. Wenn ich es Definiere wird zwar was Angezeigt, dennoch unter berücksichtigung der Exception. Lass ich es weg, geht es ohne Exception, jedoch nur ohne Inhalt, also eine Leere ComboBox.

Ich bin jetzt solangsam mit meinem Latain am Ende.

Keine Ahnung was ich jetzt noch machen könnte um das Problem an die Wand zu Nageln.

Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

J
3.331 Beiträge seit 2006
vor 15 Jahren

DataPropertyName ist nötig: Der Wert, der konkret in einer Zelle benötigt wird, kommt aus der Haupttabelle (bei Dir: kontakte). Dazu wird natürlich eine Angabe benötigt, welches Feld für diese Spalte vorgesehen ist. Getrennt davon ist die DataSource der ComboBoxColumn, die sich auf die Nachschlagewerte bezieht.

Du musst also trennen: DataGridView.DataSource unterscheidet sich von ComboBoxColumn.DataSource.

Jürgen

Andy.C Themenstarter:in
248 Beiträge seit 2004
vor 15 Jahren

Das hab ich nicht verstanden 8o

Grüße

Kostenlose Backlinks und Linktausch auf linkSpring

5.299 Beiträge seit 2008
vor 15 Jahren

Hallo ErfinderDesRades, der Link ist tot, die Seite kann nicht gefunden werden. Ah, mist. Der Punkt vom Ende des Satzes kam mit rein. Nochn versuch:
http://home.arcor.de/eckardahlers/Downloadpage/index.html

Der frühe Apfel fängt den Wurm.