Laden...

Controls auf der ersten TabPage werden auf einer anderen Tabpage angezeigt

Erstellt von diana vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.669 Views
D
diana Themenstarter:in
586 Beiträge seit 2004
vor 7 Jahren
Controls auf der ersten TabPage werden auf einer anderen Tabpage angezeigt

Hallo,

kurz noch was zum Thema. WinForms-Anwendung und beim Starten der Anwendung werden alle Controls und Tabs korrekt geladen und von mir durch eine Prozedur gesteuert, die den Zustand der Controls angibt (Enable, Visible usw.) Bis hierhin funktioniert alles. Nun bedarf es einer weiteren Automation uns Steuerung der Controls, wenn ein Nutzer etwas speichert und da passiert es. Gespeichert wird und dann rufe ich die Methode die meine Controls enabled oder visibled und dann werden die Controls der 1. Registerkarte auf der 2. Tabpage angezeigt. Anzeigefehler, da, wenn ich auf die 2. Registerkarte noch mals klicke, dann alles wieder korrekt angezeigt wird. Komme einfach nicht weiter.
Methode für den Zustand ist wie folgt aufgebaut: STATUS-Spalte aus der Prozedur gibt Kürzel zurück und danach wird geschalten. Besonderheit, bei "I", sollen die Registerkarten RemoveByKey werden, das tun sie bis jetzt auch, aber eben nur, wenn ich die Anwendung starte und das Fenster öffne. Ist das vielleicht ein Instanzen-Problem der TabPages?

:::

5.658 Beiträge seit 2006
vor 7 Jahren

Hi diana,

zeig doch mal den Code, der die Controls auf die falsche TabPage verschiebt.

Weeks of programming can save you hours of planning

2.298 Beiträge seit 2010
vor 7 Jahren

Man kann deinen Text echt schwer außeinander Pflücken. Korrigiere mich wenn ich etwas falsches schreibe. Folgende gegebenheiten hast du:
*Mehrere TabPages *Steuerelemente auf den TabPages *Status (Aktiv; Sichtbar) für die TabPages und deren Steuerelemente wird von der Datenbank abgerufen *Nach dem Speichern von Eingaben werden die Status aktuell von der DB abgerufen *Neue Status werden zunächst nicht korrekt verarbeitet *Bei manuellem erneuten Wechsel auf die jeweilige TabPage werden alle Status korrekt verarbeitet

Sofern dies alles richtig ist, wäre etwas Code interessant. Speziell wie du mit den Status-Daten umgehst. Ist der Ansatz eventuell einfach zu kompliziert?

Ich wäre das ganz simpel angegangen (wenn ich sowas über Datenbank löse):Datenbank hält für jede TabPage den Index und die Information ob die TabPage anzuzeigen ist
{
]Datenbank hält für jedes Control den Index der TabPage und die Eigenschaften Enabled sowie Visible

*Bei Start der Anwendung werden die Status ermittelt *Zuweisung der Eigenschaften für die einzelnen Controls *Bei der Speicherung von Daten werden die Status durch Trigger / durch die gespeicherte Prozedur aktualisiert *Nach dem Speichern werden die Status erneut ermittelt *Zuweisung der Eigenschaften für die einzelnen Controls

In Code dann etwa wie folgt:


private Dictionary<string, TabPage> _hiddenTabs = new Dictionary<string, TabPage>();

private void RefreshControlStates()
{
     var tabPageStates = this._dblayer.GetTabPageStates();
     var controlStates = this._dblayer.GetControlStates();

     foreach(var controlState in controlStates)
     {
         TabPage tab = this.tabControl.TabPages[controlState.TabIndex];
         foreach(Control ctrl in tab.Controls)
         {
                if(ctrl.Name.Equals(controlState.Name))
                {
                       ctrl.Visible = controlState.Visible;
                       ctrl.Enabled = controlState.Enabled;
                }
         } 
     }

     foreach(var tabState in tabPageStates)
     {
           if(tabState.Hidden)
           {
                 if(this.tabControl.TabPages.Contains(tabState.Name))
                 {
                      TabPage tab = this.tabControl.TabPages[controlState.TabIndex];
                      this.tabControl.TabPages.Remove(tab);
                      this._hiddenTabs.Add(tabState.Name, tab); 
                 }                
           }
           else
           {
                if(this._hiddenTabs.ContainsKey(tabState.Name))
                {
                      TabPage tab = this._hiddenTabs[tabState.Name]);
                      this._hiddenTabs.Remove(tabState.Name);
                      this.tabControl.TabPages.InsertAt(tabState.Index, tab);
                }
           }
     }
}

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

D
diana Themenstarter:in
586 Beiträge seit 2004
vor 7 Jahren

@inflames2k alles richtig verstanden 😃

Hier also mein Code:


if (r["STATUS"].ToString() == "I")
{
   tab.Controls.RemoveByKey(r["CONTROL"].ToString());                 
}
else
{                        
   Control c = (Control)this.Controls.Find(r["CONTROL"].ToString(), true)[0];
   SetStatus(c, r["STATUS"].ToString());
}

private void SetStatus(Control c, string status)
        {
            if (c == null) return; 

            switch (status)
            {
                case "E":               
                    c.Enabled = true;
                    c.Visible = true;               
                    break;
                case "D":
                    c.Enabled = false;
                    c.Visible = true;             
                    break;                
                case "V":
                    c.Visible = true;                         
                    break;  
            }
        }

Mehr ist es nicht. Ich schau mir die Lösungsansätze mal genauer an. Wenn noch jemand eine Idee hat...

:::