none
Vorschläge, Techniken, Konzepte - Zustände RRS feed

  • 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
    Freitag, 22. März 2013 08:24

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
    Freitag, 22. März 2013 20:44

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
    Freitag, 22. März 2013 08:47

  • 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

    Freitag, 22. März 2013 09:00
  • 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
    Freitag, 22. März 2013 20:44
  • Hi Peter,

    ich schaue es mir an und bedanke mich.

    Frage denke ich somit beantwortet.

    Viele Grüße Sandra Maier

    Samstag, 23. März 2013 16:03