Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: 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
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 06.01.15 16:17 
@Ralf: deine Umsetzung des Properties führt aber zu einem StackOverflow (da du denselben Eigenschaftennamen verwendest ;- ).
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 06.01.15 16:27 
Das war äh ... nur ein Test ... ob auch alle schön aufpassen :(
Korrigiere ich.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 :wink:) 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 11.01.15 16:58 
Den DropDownStyle der Combobox auf DropDownList setzen?
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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.