Autor Beitrag
ralph71
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Mo 12.12.16 17:21 
Hallo,

Ich möchte zur Laufzeit ein einem DGV ein Dropdown-Feld mit Daten aus einer vorher zur Laufzeit gefüllten DataTable versorgen.

Irgendwie gibts dazu viele Ansätze aber der einfachste scheint mir der über DataGridViewTextBoxColumn.DataSource zu sein.

Aber irgendwo fehlt jetzt was. Das rein über
ausblenden C#-Quelltext
1:
iDArtikelDataGridViewTextBoxColumn.DataSource = dt;					

zu machen führt nicht ans Ziel. Warum?

Danke euch....

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Titel geändert (TextBox -> ComboBox).
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 12.12.16 17:36 
Meinst du nicht eher eine DataGridViewComboBoxColumn?

Oder suchst du eine DataGridView Autocomplete TextBox?
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 13.12.16 08:38 
Ja richtig. Ist auch so im Grid als ColumnType konfiguriert.
Der Name der Spalte ist jedoch weiterhin dieser: iDArtikelDataGridViewTextBoxColumn.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 13.12.16 10:56 
Du mußt noch ValueMember und DisplayMember an der Column setzen um mitzuteilen welche Spalte im DropDown benutzt werden soll und welcher Wert wessen Spalte nachher ins DataGridView übernommen werden soll.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 13.12.16 11:10 
Hallo ralph71,

verwirrender geht es wohl nicht - daher habe ich mal den Beitragstitel hier geändert (und du solltest in deinem Sourcecode auch den Variablennamen anpassen, sonst findest du später selber nicht mehr durch).
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 13.12.16 14:17 
Ihr hab Recht. Das kommt raus, wenn man 1000 Sachen gleichzeitig macht....
Ok, hab den Namen geändert.

Jetzt wenn ich wüsste, wie Code richtig dargestellt wird. Ich finde das nicht.... :-(

mein von Anfang an bestehender Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
....
DataTable dt = new DataTable();
sda.Fill(dt);
iDArtikelDataGridViewComboBoxColumn.DataSource = dt;
iDArtikelDataGridViewComboBoxColumn.ValueMember = "ArtikelNummer";
iDArtikelDataGridViewComboBoxColumn.DisplayMember = "ArtikelBezeichnung";
....

Fehlermeldung: der DataGridViewComboBoxCell-Wert ist ungültig.

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 13.12.16 14:24 
Interessant wäre, neben dem was, auch wo es passiert.

- Ist jeder Wert der in der DataGridViewColumn enthalten ist auch in der DataTable die du da bindest? Oder anders gibt es jede ArtikelNummer die im DataGridView auftaucht auch in dt?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 13.12.16 15:56 
Hallo ralph71,

unter "Bereiche" kannst du C#-Code entsprechend mit dem Tag versehen oder aber per Hand:
ausblenden Quelltext
1:
[cs]...[/cs]					
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 15.12.16 13:53 
Hallo,

ich komm da nicht weiter. Im Debugger springt wird die Zuweisung zur DataTable problemlos akzeptiert.
Hintergrund der Aktion: natürlich kann ich der ComboBox direkt einen SELECT zuweisen. Das hat aber zur Folge, dass bei einer Datenpflege im Grid jedesmal eine Datenbankverbindung aufgebaut werden muss. Deshalb möchte ich im Load-Ereignis die Datenquelle für die ComboBOx einmal laden und gut is.

"Oder anders gibt es jede ArtikelNummer die im DataGridView auftaucht auch in dt?" --> Nein, weil es ja sein kann, dass Artikel in der Auswahl künftig nicht mehr vorhanden sein sollen um "Fehlbelegungen" zu vermeiden.

Wo passiert es? Im Debugger ist kein Fehler zu sehen. Die Meldung erscheint, wenn der Mauszeiger auf die ComboBox trifft.
Ich habe jetzt mal die "100" Fehlermeldungen mit OK Bestätigt und dann erscheinen tatsächlich im Dropdown die Einträge. Nach Auswahl erscheint aber sofort die Fehlermeldung.

In der Zieltabelle ist das Feld ein INT. Kann es sein, dass die dt einen String da reinschreiben will?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 15.12.16 14:07 
Zitat:
"Oder anders gibt es jede ArtikelNummer die im DataGridView auftaucht auch in dt?" --> Nein, weil es ja sein kann, dass Artikel in der Auswahl künftig nicht mehr vorhanden sein sollen um "Fehlbelegungen" zu vermeiden.


So funktioniert aber die ComboBox in einem Grid. Die Datenquelle die direkt am Grid hängt sollte nur die Artikelnummer enthalten. Zumindest sollte das die Basis für diese Spalte sein. Nun versucht das Grid für jede Zelle der Spalte einen passenden Datensatz aus der DataSource der Spalte zu finden, also die passende Artikelnummer (der Valuemember wird gematched), um dann in der Zelle die Artikelbezeichnung anzuzeigen.

Falls du bereits die Artikelbezeichnung als Basis dieser Spalte benutzt gibt es möglicherweise den Fehler den du beschreibst, weil Artikelbezeichnung != Artikelnummer ist und weder was passendes gefunden werden kann noch wird das vermutlich von den Datentypen her passen.
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Do 15.12.16 14:07 
jetzt gehts.

Dämlich: Datentyp Zieltabelle: INT, Datentyp der ComboBox Quelle VARCHAR. Kann nicht funktionieren.
Jetzt ist Quelle und Ziel ein INT und schon gehts.

Trotzdem Danke für die Hilfe!
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Fr 16.12.16 14:20 
So, jetzt is es so weit.
In Anlehnung an "...Nun versucht das Grid für jede Zelle der Spalte einen passenden Datensatz aus der DataSource der Spalte zu finden....".
Der Benutzer soll jederzeit in der Lage sein, die in der ComboBox zur Auswahl angezeigten Werte zu verändern (= Benutzer hat Favoriten). Wenn ich einen bereits verwendeten ComboBox-Eintrag aus der Datenquelle entferne, dann fährt das ganze an die Wand.
Die ComboBox versucht immer die Datenquelle mit den Einträgen abzugleichen.

Beispiel aus der Praxis: ein Artikel ist nicht mehr im Bestand und damit in der ComboBox nicht mehr auswählbar. Damit würden aber alle DGV der Vergangenheit mit diesem Eintrag an die Wand fahren.....

Wie wäre da der Lösungsansatz?
Vielen Dank!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 16.12.16 15:44 
Dann füge doch einfach eine DB-Spalte "ImBestand" ein und ändere die Abfragen dementsprechend.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 16.12.16 16:35 
Letztlich hilft dir dann eine Combobox Spalte nicht. Du brauchst eine andere Art von Column mit einem DropDown das unabhängig ist von dem was sonst noch so in der Spalte angezeigt wird.

Das mit den Favoriten verstehen ich aber nicht so ganz. Der Nutzer kann nur seine Favoriten auswählen? Alles andere was auch ginge ist für ihn nicht erreichbar weil es nicht in der Combobox auftaucht?
Klingt nach einer schwer vermittelbaren UI. Und wenn es schon sowas wie Favoriten braucht ist die Menge an Artikeln mögliherweise schon so groß das eine Combobox vermutlich eine zu simple Auswahlmethode ist um einen Artikel zu finden.
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Mo 19.12.16 08:32 
@Th69 --> ein weiteres Merkmal führt nicht zum Ziel. Denn, warum ein Wert in der ComboBox nicht mehr vorhanden ist (gelöscht oder durch SELECT ausgefiltert) ist egal. Tatsache ist, der Wert ist nicht mehr vorhanden und damit funktioniert das nicht mehr.

@Ralf Jansen --> das mit Artikeln und Favoriten ist nur ein vereinfachtes Bespiel um das Problem schnell darstellen zu können. Welche andere Art von Column soll das sein? Eine ungebundene Spalte?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 19.12.16 13:53 
Zitat:
Welche andere Art von Column soll das sein? Eine ungebundene Spalte?


Nein eine neue Column Klasse neben DataGridViewComboBoxColumn die noch von dir zu programmieren wäre.
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Di 20.12.16 14:32 
.... aber es kann doch nicht sein, dass eine Anwendung an die Wand fährt, nur weil irgendwann mal die Source einer ComboBox geändert wird. Das soll im Standard nicht zu regeln sein?
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 20.12.16 17:51 
Zitat:
Das soll im Standard nicht zu regeln sein?


Ein Standard sollte nur eindeutiges Verhalten regeln in deinem Fall wüsste ich nicht mal was passieren sollte. Soll die Zelle im Grid leer bleiben wenn der Wert in der Combobox fehlt? Soll anstatt des Wertes aus der DataSource der Column der Wert der DataSource des Grids angezeigt werden (Hier dann die Artikelnummer anstatt der Artikelbezeichnung). Soll aus irgendeiner unbekannten 3.ten Quelle der Wert kommen? Wenn nicht alles in der Combobox enthalten ist wie mache ich eine falsche Auswahl rückgängig wenn nicht alles in der Combobox enthalten ist.

Wenn ich noch länger überlege fallen mir sicher weitere Probleme ein die nicht einfach über ein einen ~Standard~ abdeckbar sind außer wir definieren alles als Standard und machen aus einem schlanken Grid einen unbeherrschbar konfigurierbares Featuremonster mit dem alle überfordert sind. Standard sollte eine sehr knapp bemessene Menge von Möglichkeiten sein darüber hinaus ist man dann man halt als das gefordert was man ist .. ein Programmierer.
ralph71 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 54



BeitragVerfasst: Mi 21.12.16 14:43 
Irgendwo hast du ja Recht. :-)
Muss mir einen anderen Weg überlegen.
Alternativen:
a) ungebundenes Combofeld, das den Eintrag in eine zweite Spalte es DVG schreibt. Irgendwie unschön.
b) bereits verwendete Combofeld-Einträge dürfen nicht mehr aus der Source des Combofeldes gelöscht werden.