Autor |
Beitrag |
ralph71
      
Beiträge: 54
|
Verfasst: 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
C#-Quelltext 1:
| iDArtikelDataGridViewTextBoxColumn.DataSource = dt; |
zu machen führt nicht ans Ziel. Warum?
Danke euch....
Moderiert von Th69: C#-Tags hinzugefügt
Moderiert von Th69: Titel geändert (TextBox -> ComboBox).
|
|
Th69
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mo 12.12.16 17:36
|
|
ralph71 
      
Beiträge: 54
|
Verfasst: 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 Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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 
      
Beiträge: 54
|
Verfasst: 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:
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 Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 13.12.16 15:56
Hallo ralph71,
unter "Bereiche" kannst du C#-Code entsprechend mit dem Tag versehen oder aber per Hand:
Quelltext
|
|
ralph71 
      
Beiträge: 54
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 54
|
Verfasst: 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 
      
Beiträge: 54
|
Verfasst: 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
      

Beiträge: 4795
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 16.12.16 15:44
Dann füge doch einfach eine DB-Spalte "ImBestand" ein und ändere die Abfragen dementsprechend.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 54
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 54
|
Verfasst: 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
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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 
      
Beiträge: 54
|
Verfasst: 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.
|
|