Entwickler-Ecke

WinForms - DataGridViewComboBoxColumn nur ReadOnly möglich?


Christoph1972 - So 23.11.08 10:46
Titel: DataGridViewComboBoxColumn nur ReadOnly möglich?
Hallo Leute!


Wie kann ich es denn ermöglichen, dass der User in einer DataGridViewComboBoxColumn etwas von Hand eintragen kann, wenn der gewünschte Wert nicht in der Collection ist? Bei der Standard-ComboBox geht das ja immer.


Dadurch ergibt sich ein zweites Problem. Das DGV ist an eine Datenbank gebunden. Wenn nun ein Item aus der Liste, die an die ComboBoxColumn gebunden ist, entfernt wird, knallt es, wenn ein Datensatz mit dem gelöschten Item aufgerufen wird. Dann gibt es ein CellError, weil der Wert nicht mehr in der ComboBox-Collection vorhanden ist.


Gruß
Christoph


Kha - So 23.11.08 14:41
Titel: Re: DataGridViewComboBoxColumn nur ReadOnly möglich?
user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Dadurch ergibt sich ein zweites Problem. Das DGV ist an eine Datenbank gebunden. Wenn nun ein Item aus der Liste, die an die ComboBoxColumn gebunden ist, entfernt wird, knallt es, wenn ein Datensatz mit dem gelöschten Item aufgerufen wird. Dann gibt es ein CellError, weil der Wert nicht mehr in der ComboBox-Collection vorhanden ist.
Dann stimmt eher etwas mit deiner Datenbank nicht. Es darf nicht passieren, dass eine Referenz ins Nichts zeigt. Wenn du eine Foreign-Key-Constraint hast, sollte die DB auch einen Fehler melden (oder je nach Einstellung eben alle ungültigen Referenzen löschen).


Christoph1972 - So 23.11.08 14:55

Wenn du eine Foreign-Key-Constraint hast, sollte die DB auch einen Fehler melden (oder je nach Einstellung eben alle ungültigen Referenzen löschen).


Hi, ja genau das passiert. Aber das möchte ich nicht. Ich möchte das dann der Wert aus der Datenbank in das Feldeingetragen wird, so als wenn es ein Textfeld wäre.


Gruß
Christoph


Kha - So 23.11.08 15:13

user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Hi, ja genau das passiert. Aber das möchte ich nicht. Ich möchte das dann der Wert aus der Datenbank in das Feldeingetragen wird, so als wenn es ein Textfeld wäre.
Ich bin mir nicht sicher, was du damit meinst. Aber schau dir das einmal an: http://en.wikipedia.org/wiki/Foreign_key#Referential_Actions


Christoph1972 - So 23.11.08 15:32

Und ich bin mir jetzt nicht sicher was du meinst :lol:

Also, wenn ich ein Textfeld statt der ComboBox nehme funktioniert alles wunderbar. Auch wenn ich eine CombBox nehme. Nur wenn aus der Liste, die an die die CB gebunden ist(nicht an die Datenbank gebunden) ein Item nicht mehr vorhanden ist dann wird der nicht mehr vorhandene Wert nicht in der CB angezeigt, obwohl dieser in der Datenbank steht.


Gruß
Christoph


Kha - So 23.11.08 16:47

user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
(nicht an die Datenbank gebunden)
Aha. Nur... warum :lol: ? DataSets kennen jedenfalls den gleichen Trick wie in meinem Link: ForeignKeyConstraint.DeleteRule.
Vielleicht kommen wir weiter, wenn du dem Kind mal einen Namen gibst und konkret erklärst, was du warum löschen willst ;) .


Christoph1972 - So 23.11.08 18:35

Ich möchte gar nicht löschen, das machen die schlimmen User :P

Also, der User hat die Möglichkeit die Liste mit den Items selbst zu verwalten, das heißt löschen, umbenennen und zufügen. Es wird also nur eine Frage der Zeit sein, bis mal was schiefgeht, weil umbenannt oder gelöscht wurde. Das Risiko ließe sich schon erheblich reduzieren, wenn der User die Möglichkeit hätte, auch mal was so in die ComboBox zu schreiben, dann wäre das Verlangen nicht so groß die Liste zu verändern, was eigentlich ehr eine Ausnahme sein wird. Aber es wird eben vorkommen, weil die ComboBox sich nicht so editieren lässt. Wenn es dann doch vorkommen sollte, würde ich einfach bei CellError eine Message schmeißen, das das Item nicht mehr in der Liste vorkommt.


Vielen Dank schon mal für deine Hilfe!!


Kha - So 23.11.08 19:36

user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Wenn es dann doch vorkommen sollte, würde ich einfach bei CellError eine Message schmeißen, das das Item nicht mehr in der Liste vorkommt.
Naja, vernünftige User Experience sieht anders aus :zwinker: . Du weißt doch, du musst den User vor sich selbst schützen. Entweder würde ich also das Löschen noch benutzter Einträge verbieten oder eben alle referenzierenden Einträge nach einer Rückfrage löschen/zurücksetzen. Den Fehler nach hinten zu schieben, bis es dann mal bei der Anzeige knallt, kann doch nicht die Lösung sein.


Christoph1972 - So 23.11.08 21:37

Entweder würde ich also das Löschen noch benutzter Einträge verbieten


Ich kann nicht ermitteln welche Einträge noch genutzt werden, da es immer verschieden Projekte mit verschieden Datenbanken gibt. Vorwiegend könnten dann die alten DBs betroffen sein, weil diese dann nicht mehr up to date ist.

Gibt es denn wirklich keine Möglichkeit die ComboBox beschreibbar zu machen? Das ist doch völliger quatsch das das nicht geht. Mit der "Standard" CB geht das ja auch.


Gruß
Christoph


Kha - Mo 24.11.08 15:08

user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Das ist doch völliger quatsch das das nicht geht.
Hm, nö ;) . Die CBColumn ist für Foreign Keys gedacht und das DGV kann nunmal nicht wissen, wie es neue Daten in die Child-Tabelle eintragen soll. Gut, wenn die ComboBox an einer IList<string> hängt, wäre das kein so großes Problem, aber der Standard ist eben eine zweite DataTable.


Christoph1972 - Mo 24.11.08 22:31

Hi :-)


Ja meine die ComboBox hängt an einer List< >. Na ja, schade, da kann ich wohl nichts machen. Es wird aber nicht lange dauern, bis die User von mir fordern dies zu ermöglichen. Dann muss ich wohl erstmal absagen, wenigstens liegt es nicht an mir, ich werde sie dann an Bill verweisen :lol:


Also, vielen Dank für deine Unterstützung! :zustimm:



Soll ich diesen Beitrag auf ready setzen?, ist ja nicht wirklich ready................


Gruß
Christoph