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
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 😉
Hallo Karill,
nein, weil auch die Option "keine von beiden" existieren soll.
Grüße, Alex
Final no hay nada más
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
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
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
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
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
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.
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