Autor |
Beitrag |
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Mo 05.01.15 21:03
Hallo,
ich habe eine Combobox, die ich per DataBinding an eine Property (Long) einer Modellklasse gebunden habe.
Dieser Wert soll in einer Datenbank als FremdschlüsselID genutzt werden.
Nun habe ich das Problem, dass der User auch berechtigt wäre dort nichts in der Combobox auszuwählen.
In der Datenbank habe ich das Feld markiert als "null zugelassen"
Leider ist der Wert einer Combobox, die nicht ausgewählt wurde 0 und halt nicht "null".
Dadurch bekomme ich immer den Fehler, dass er die ChildRow nicht setzen kann, da es die ReferenzID 0 halt nicht gibt in der anderen Tabelle
Wie kann ich dies beheben?
Danke
Gruß
Daniel
|
|
Christoph1972
Beiträge: 690
Erhaltene Danke: 16
VS2015 Pro / C# & VB.Net
|
Verfasst: Di 06.01.15 07:50
Guten Morgen,
du könntest den FallBackValue von der ComboBox nutzen, diesen kannst du unter Binding angeben. Vielleicht hilft dir das!?
_________________ Gruß
Christoph
|
|
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Di 06.01.15 09:41
Hi,
danke da schaue ich mal näher nach, ob ich was finde.
Gruß
Daniel
Edit:
Habe unter Fallback nur Dinge zu WPF gefunden und konnte diese nicht umsetzen.
Ich habe die Property nun verändert.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public long CustomerUnitAsNull { get { return (long)CustomerUnit; } set { if (CustomerUnit > 0) CustomerUnit = value; else CustomerUnit = null; } } |
Damit würde es gehen.
Was haltet ihr davon?
Gruß
Daniel
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 06.01.15 11:08
Sieht irgendwie verkehrt aus. Weniger wegen der Idee sondern der Umsetzung
Ich gehe mal davon aus das CustomerUnit nullable ist und scheinbar CustomerUnitAsNull nicht mehr nullable sein soll (der Name der Property ist da etwas problematisch ) dann muß auch im getter aus der möglichen null irgendein gültiger long Wert werden, z.B. 0.
Unter der Annahme das aus null 0 und umgekehrt werden soll dann
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| public long CustomerUnitAsLong { get { return CustomerUnit ?? 0; } set { if (value == 0) CustomerUnit = null; else CustomerUnit = value; } } |
Zuletzt bearbeitet von Ralf Jansen am Di 06.01.15 16:28, insgesamt 1-mal bearbeitet
|
|
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Di 06.01.15 15:01
Ok, Ansatz ok, Umsetzung Mangelhaft.
Naja wenigstens ein kleiner Fortschritt, dass ich eine Idee hatte.
Danke...
Schaue es mir nachher zu Hause an.
Ja mit der Namensgebung tue ich mich richtig schwer...
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 06.01.15 16:17
@Ralf: deine Umsetzung des Properties führt aber zu einem StackOverflow (da du denselben Eigenschaftennamen verwendest ;- ).
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 06.01.15 16:27
Das war äh ... nur ein Test ... ob auch alle schön aufpassen
Korrigiere ich.
|
|
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Fr 09.01.15 15:15
Hallo,
entschuldigt, dass es ein wenig länger gedauert hat die Rückmeldung.
Die Arbeit hat mich überrannt.
Danke schon mal für den Code. Funktioniert soweit ich das sehen kann gut. Habe es eben probiert.
Natürlich wäre mir der Fehler von Ralph auch sofort aufgefallen *hust*
Ich hätte da noch eine kleine Anschluss Frage.
Wenn der Benutzer einen Wert aus der Combobox auswählt, hat die Property den Wert des SelectedValue erhalten. (Zum Beispiel 10)
Wenn der Benutzer nun, den Text aus der Combobox raus löscht und denkt, er hätte jetzt nichts ausgewählt, ist die Property aber immer noch mit 10 gefüllt.
Wie würde ich so was steuern können, bzw. verhindern?
Danke
Gruß
Daniel
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 09.01.15 15:55
Zitat: | Wenn der Benutzer einen Wert aus der Combobox auswählt, hat die Property den Wert des SelectedValue erhalten. (Zum Beispiel 10)
Wenn der Benutzer nun, den Text aus der Combobox raus löscht und denkt, er hätte jetzt nichts ausgewählt, ist die Property aber immer noch mit 10 gefüllt. |
SelectedValue ist immer ein Wert aus der Liste. Wenn du also nichts in die TextBox einträgst dann kann die ComboBox nicht mit der Liste synchronisieren (außer es ist auch ein nix in der Liste ) und beläßt es auf dem letzten Wert. Was sollte er auch anderes tun.
Wenn du Werte zulassen willst die nicht in der Auswahlliste sind mußt du das selbst ausprogrammieren. Databinding wird dir da nicht konkret weiterhelfen. Wenn sinnvoll möglich kannst du für das Ziel in dem die Auswahl benutzt werden auch an Text binden. Mußt dich nur darum kümmmern das aus Text auch wieder der passende Datentyp wird weil Text ist nunmal ein String.
|
|
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: So 11.01.15 15:07
Hallo Ralf,
ich möchte es ja eigentlich gar nicht, dass der User da was eingeben kann.
Wie kann ich den verhindern, dass er selber Text eingibt, oder den per DropDown gewählten Text löschen kann.
Gruß
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: So 11.01.15 16:58
Den DropDownStyle der Combobox auf DropDownList setzen?
|
|
Talemantros
Beiträge: 444
Erhaltene Danke: 2
Win7 Proff 64bit
C# (VS2013)
|
Verfasst: Mo 12.01.15 08:23
Sorry
Aber jetzt bedingt dies doch noch mal eine andere Frage
Die Combobox wird ja aus der Datenbank als datatable gefüllt.
Wenn der Benutzer jetzt einmal was ausgewählt hätte könnte er diese Entscheidung nicht zurück nehmen.
Kann ich irgendwie den ersten Eintrag als Leer deklarieren, so dass man das auch wieder entfernen kann?
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 12.01.15 10:43
Zitat: | Kann ich irgendwie den ersten Eintrag als Leer deklarieren, so dass man das auch wieder entfernen kann? |
Schreib einfach einen solchen Eintrag in die gebundene Liste? So wie jeden anderen Eintrag auch?
Oder eben wie auch vorgeschlagen das selbst aus programmieren. Z.B. in dem du das löschen selbst verdrahtest. Eine Möglichkeit einfach den DEL Key verdrahten.
C#-Quelltext 1: 2: 3: 4: 5: 6:
| private void MeineLiebenLoeschbarenComboBoxen_KeyUp(object sender, KeyEventArgs e) { ComboBox cb = sender as ComboBox; if ((cb != null) && (e.KeyCode == Keys.Delete)) cb.SelectedIndex = - 1; } |
Ob du jetzt dort konkret an SelectedIndex oder an einer der anderen SelectedXXX Properties schrauben mußt hängt ein wenig vom, Framework ab gegen du du programmierst. Das Verhalten wurde leider mehrmals gefixt/verschlimmbessert.
|
|