Benutzer mit den meisten Antworten
Vorschläge, Techniken, Konzepte - Zustände

Frage
-
Hallo Zusammen!
Gibt es von Euch Vorschläge, Techniken, Konzepte wie man bestimmte Zustände abfängt etc.
Beispiel
10 Buttons, WinForm oder ASP
Je nach Zustand sind einige Buttons deaktiviert, weil diese im Zustand XY keinen Sinn machen.
Z.B. Speichern Button ist frei, bei Änderungen, bei den meisten Applikationen.
Geht was nicht, hat man ja schon viel abgefangen, wenn man es dem Bediener nicht erlaubt.
z.B. ich muss erst Button 3 die Freigabe haben, erst dann wird Button 10 freigeschaltet.
Stichwort, BitMask, ?
Einfach mal wie ihr das so angeht.
Danke für Tipps im Voraus.
Gruß, Sandra
Antworten
-
Hi Sandra,
hier mal ein ganz einfache Demo, um die Prinzipien darzustellen:
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private TextBox tb1 = new TextBox() { Location = new Point(10, 10), ReadOnly = true }; private TextBox tb2 = new TextBox() { Location = new Point(10, 40) }; private Button btn1 = new Button() { Location = new Point(120, 10), Text = "Button 1", Tag = 1 }; private Button btn2 = new Button() { Location = new Point(120, 40), Text = "Button 2", Tag = 2 }; private Button btn3 = new Button() { Location = new Point(120, 70), Text = "Button 3", Tag = 3 }; private ViewModel vm = new ViewModel(); private void Form1_Load(object sender, EventArgs e) { this.Controls.AddRange(new Control[] { tb1, tb2, btn1, btn2, btn3 }); btn1.Click += btn_Click; btn2.Click += btn_Click; btn3.Click += btn_Click; vm.PropertyChanged += vm_PropertyChanged; BindControls(); } void btn_Click(object sender, EventArgs e) { vm.Status = (int)((Button)sender).Tag; } void vm_PropertyChanged(object sender, PropertyChangedEventArgs e) { BindControls(); } private void BindControls() { tb1.DataBindings.Clear(); tb1.DataBindings.Add("Text", vm, "Status"); tb2.DataBindings.Clear(); tb2.DataBindings.Add("Visible", vm, "Sichtbarkeit1"); btn1.DataBindings.Clear(); btn1.DataBindings.Add("Visible", vm, "Sichtbarkeit1"); btn2.DataBindings.Clear(); btn2.DataBindings.Add("Visible", vm, "Sichtbarkeit2"); btn3.DataBindings.Clear(); btn3.DataBindings.Add("Visible", vm, "Sichtbarkeit3"); } } public class ViewModel : INotifyPropertyChanged { public bool Sichtbarkeit1 { get { return this._status != 2; } } public bool Sichtbarkeit2 { get { return this._status < 3; } } public bool Sichtbarkeit3 { get { return this._status >= 2; } } private int _status; public int Status { get { return this._status; } set { if (this._status != value) { this._status = value; OnPropertyChanged("Status"); } } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } }
--
Viele Gruesse
Peter- Als Antwort markiert Sandra Maier Samstag, 23. März 2013 16:03
Alle Antworten
-
Hi Sandra,nach Deiner Beschreibung würde ich einen Zustandsautomaten programmieren. Die Zustände könnten, wenn mehrere Zustände gleichzeitig existieren können, auch in einer BitMask verwaltet werden. Über einen Converter werden dann Sichtbarkeiten (Visible) bzw. Nur-Lese-Zugriffe (IsReadOnly) gesteuert. Der Konverter kann eine Transformationsmatrix nutzen, d.h., welcher Zustand wirkt sich wie auf Sichtbarkeit und EditModus aus. Damit wäre dann eine recht flexible Lösung möglich.Wenn es etwas einfacher sein soll, dann nimm für jeden Zustand einen Wert einer Variablen. Jeder Zustand setzt dann Eigenschaften, die sich auf Sichtbarkeit und/oder EditModus auswirken. Das kann man bei wenigen Zuständen auch mit einer langen IF-Kette machen.--
Peter Fleischer -
nach Deiner Beschreibung würde ich einen Zustandsautomaten programmieren. Die Zustände könnten, wenn mehrere Zustände gleichzeitig existieren können, auch in einer BitMask verwaltet werden.
Hallo Peter,
hast Du hier mal Code parat? Einfach dass man die Vorgehensweise sieht?
Danke und Grüße Sandra
-
Hi Sandra,
hier mal ein ganz einfache Demo, um die Prinzipien darzustellen:
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private TextBox tb1 = new TextBox() { Location = new Point(10, 10), ReadOnly = true }; private TextBox tb2 = new TextBox() { Location = new Point(10, 40) }; private Button btn1 = new Button() { Location = new Point(120, 10), Text = "Button 1", Tag = 1 }; private Button btn2 = new Button() { Location = new Point(120, 40), Text = "Button 2", Tag = 2 }; private Button btn3 = new Button() { Location = new Point(120, 70), Text = "Button 3", Tag = 3 }; private ViewModel vm = new ViewModel(); private void Form1_Load(object sender, EventArgs e) { this.Controls.AddRange(new Control[] { tb1, tb2, btn1, btn2, btn3 }); btn1.Click += btn_Click; btn2.Click += btn_Click; btn3.Click += btn_Click; vm.PropertyChanged += vm_PropertyChanged; BindControls(); } void btn_Click(object sender, EventArgs e) { vm.Status = (int)((Button)sender).Tag; } void vm_PropertyChanged(object sender, PropertyChangedEventArgs e) { BindControls(); } private void BindControls() { tb1.DataBindings.Clear(); tb1.DataBindings.Add("Text", vm, "Status"); tb2.DataBindings.Clear(); tb2.DataBindings.Add("Visible", vm, "Sichtbarkeit1"); btn1.DataBindings.Clear(); btn1.DataBindings.Add("Visible", vm, "Sichtbarkeit1"); btn2.DataBindings.Clear(); btn2.DataBindings.Add("Visible", vm, "Sichtbarkeit2"); btn3.DataBindings.Clear(); btn3.DataBindings.Add("Visible", vm, "Sichtbarkeit3"); } } public class ViewModel : INotifyPropertyChanged { public bool Sichtbarkeit1 { get { return this._status != 2; } } public bool Sichtbarkeit2 { get { return this._status < 3; } } public bool Sichtbarkeit3 { get { return this._status >= 2; } } private int _status; public int Status { get { return this._status; } set { if (this._status != value) { this._status = value; OnPropertyChanged("Status"); } } } public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyChanged(string propName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propName)); } } }
--
Viele Gruesse
Peter- Als Antwort markiert Sandra Maier Samstag, 23. März 2013 16:03