Laden...

Datenbindung mit Checkboxen: Maximal eine soll "Checked" sein

Erstellt von ill_son vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.682 Views
I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 11 Jahren
Datenbindung mit Checkboxen: Maximal eine soll "Checked" sein

Hallo,

ich habe eine Form, in der sich unter anderem zwei Checkboxen befinden, die ich an eine Datenquelle binden möchte. Nun soll von den beiden maximal eine "Checked" sein. Ich habe versucht, es wie folgt zu lösen und stehe etwas auf dem Schlauch, warum das nicht funktioniert.


public partial class Form1 : Form
    {
        Data data = new Data();
        
        public Form1()
        {
            InitializeComponent();
            this.checkBox1.DataBindings.Add(new Binding("Checked", data, "A"));
            this.checkBox2.DataBindings.Add(new Binding("Checked", data, "B"));
        }
    }

    public class Data : INotifyPropertyChanged
    {

        private bool a;
        public bool A
        {
            get{return a;}
            set
            {
                if (value != a)
                {
                    a = value;
                    OnPropertyChanged("A");
                    if (value)
                        B = false;
                }
            }
        }

        private bool b;
        public bool B
        {
            get { return b; }
            set
            {
                if (value != b)
                {
                    b = value;
                    OnPropertyChanged("B");
                    if (value)
                        A = false;
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string info)
        {
            PropertyChangedEventHandler propertyChanged = PropertyChanged;
            if (propertyChanged != null)
                propertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

Vielleicht sehe ich den Wald vor lauter Bäumen nicht. Für einen Hinweis wäre ich sehr dankbar.

Grüße, Alex

Final no hay nada más

S
269 Beiträge seit 2010
vor 11 Jahren

abgesehen von deiner Frage:
wäre für diesen Zweck nicht die Verwendung von Radio Buttons sinniger?
Das würde den User dann auch auf den ersten Blick erkennen lassen, dass er eine von beiden Optionen auswählen soll 😉

I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 11 Jahren

Hallo Karill,

nein, weil auch die Option "keine von beiden" existieren soll.

Grüße, Alex

Final no hay nada más

D
615 Beiträge seit 2009
vor 11 Jahren

Hallo ill_son

Hatte mal eine ähnliche Anforderung. Nicht ganz konventionell, aber hab sie so gelöst :

=> RadioButton so überschreiben, dass z.B ein Doppelklick oder ein weiteres selektieren eines bereits aktiven RadioButton's, zum de-selektieren führt 😃

Beste Grüsse

Diräkt

5.658 Beiträge seit 2006
vor 11 Jahren

Oder einfach eine Option "Deaktiviert"/"None"/"Keine Auswahl" etc.

Auf jeden Fall sind Checkboxen nicht das geeignete Steuerelement!

Christian

Weeks of programming can save you hours of planning

I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 11 Jahren

Hallo,

das wäre eine Möglichkeit. Mich würde aber auch interessieren, ob das, was da steht, formal korrekt ist, weil es wie gesagt, nicht das macht, was es soll. Manchmal reagiert die Checkbox beim klicken, manchmal nicht, aber finde den Fehler nicht. Stimmt die Bindung so?

Grüße, Alex

Final no hay nada más

1.378 Beiträge seit 2006
vor 11 Jahren

Die Bindings schauen an und für sich ok aus aber ich vermute den Hund irgendwo im Bindingsystem von Windows.Forms begraben. Ich hab schon so oft Schwierigkeiten damit gehabt weil das System einfach total unverständlich reagiert. Manchmal/Oft muss man ein BindingManager.EndEdit/Accept oder ein Binding.WriteValue() im Codebehind nachsetzen, damit die Werte auch wirklich greifen. Wirklich verstanden hab ichs nie und ich bin auch froh, dass dies bei WPF nun wesentlich besser läuft.

Lg, XXX

I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 11 Jahren

Hallo xxxprod,

kannst Du mir das kurz erläutern, oder einen Link posten, wo ich schauen kann, wie das funktioniert?

Danke,

Alex

edit: Ich habe jetzt das OnPropertyChanged nach der if-Bedingung platziert. Nun funktioniert es. Zumindest die Bindung der Checkboxen mit A und B. Das gegenseitige ausschalten nocht nicht. Die Richtung von data -> Checkboxen funktioniert. Nur die Bindung Checkboxen -> data macht komische Sachen. 🤔

Final no hay nada más

1.378 Beiträge seit 2006
vor 11 Jahren

Die Male wo ich mit Bindings Probleme hatte, bin ich irgendwie durch ewiges debuggen und ausprobieren dann zu einer Lösung gekommen oder auch nicht. Allgemein kann ich leider nichts dazu sagen.

Lass dir mal alle Möglichen Events in der Console oder in ein LogFile ausgeben. Setter/Getter-Entry/Exit, MouseDown, MouseUp, CheckedChanged, PropertyChanged und schau ob dir dabei etwas auffällt.

Manchmal wird ein Getter nicht abgefragt, wenn er aus einem Setter aufgerufen wurde. - Dies passiert aber normalerweise nur wenn es sich ums selbe Property handelt.

Mittels dem logging solltest du aber konkret feststellen könne wie das Program sich genau verhält und dazu kann man dann vielleicht eine konkretere Aussage treffen.

Lg, XXX

//Edit: Evt. hilft ein BeginInvoke um A/B=false zu legen um diese Ausführung kurz Zeitverzögert auszuführen.

I
ill_son Themenstarter:in
227 Beiträge seit 2009
vor 11 Jahren

Ich habe noch etwas im Netz gesucht und ein ähnlich geartetes Problem gefunden. Wenn ich die Bindung so realisiere:


bndsrc = new BindingSource();
bndsrc.DataSource = data;
checkBox1.DataBindings.Add("Checked", bndsrc, "A", true, DataSourceUpdateMode.OnPropertyChanged);
checkBox2.DataBindings.Add("Checked", bndsrc, "B", true, DataSourceUpdateMode.OnPropertyChanged);

funktioniert es.

Grüße,

Alex

Final no hay nada más