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?
:::
Hi diana,
zeig doch mal den Code, der die Controls auf die falsche TabPage verschiebt.
Weeks of programming can save you hours of planning
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 |
@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...
:::