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
Guten morgen
kannst doch einfach auf der DataGridView im Designer die entsprechende Spalte mit ColumsType = DataGridViewComboBoxColumn setzen und somit sollte es schon funktionieren.
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.
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.
... 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.
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
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
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
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
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
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
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
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
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
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
Das hab ich nicht verstanden 8o
Grüße
Kostenlose Backlinks und Linktausch auf linkSpring
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.