Laden...

UserControl Activated Event (?)

Erstellt von mathias_f vor 13 Jahren Letzter Beitrag vor 13 Jahren 5.553 Views
M
mathias_f Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren
UserControl Activated Event (?)

tagchen

Form mit SplitContainer
links TreeView, rechts mehrere UserControls übereinander (Z Order)

TreeView.AfterSelect -> UCxy.BringToFront()

Nachdem ich also alle UCs in Panel2 geladen hab, zeige ich beim TreeView Klick das gewünschte an.

Nun will ich aktuelle Daten eines Geräts über RS232 auslesen und zwar erstens bei "Load" Event des UCs und zum anderen immer wenn es aktiviert/sichtbar wird.
Load Event gibts. Ok. Passiert aber nur 1x (wenn ich nicht remove/unloade).
Leider gibts keinen "Activated" Event wie bei Form worauf ich die Daten aktualisieren könnte.

Meine momentane Abhilfe:
TreeView.AfterSelect -> UCxy.BringToFront(), dann UCxy.Focus()
Mit dem Focus() wird der "Enter" Event gefeuert und ich hab meinen Trigger.
Unschön: das Formular lädt nicht selbstständig, sondern muss immer "von aussen" gefocust werden.

ähnlich: UserControl AfterLoad-Event?

Gibts bessere Wege?

R
16 Beiträge seit 2009
vor 13 Jahren

Hi,

vielleicht Hilft Dir

Enter oder GotFocus weiter.

Bei den Links wird auch gleich dargestellt in welcher Reihenfolge die Events gefeuert werden.

Grüße
riddick

4.221 Beiträge seit 2005
vor 13 Jahren

Bau Dir eine Public Method auf dem UserControl.

In dieser lädst Du die Daten.

Diese Methode rufst Du immer dann auf wenn Du Daten laden oder Refreshen willst (z.B: beim Load... oder auch beim TreeView.AfterSelect).

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
mathias_f Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Danke für eure Posts

um einen Aufruf komm ich also nicht herum. Entweder explizit focus setzen (Event nutzen) oder meine eigne UC.Refresh() aufrufen.

Grüsse aus der Schweiz.

5.299 Beiträge seit 2008
vor 13 Jahren

TreeView.AfterSelect -> UCxy.BringToFront()

Gibts bessere Wege?

grade kam mir die Idee: Verwende statt UCxy.BringToFront() UCxy.Visible=true/false - dann hast du in den Ucls das VisibleChanged-Event.

Der frühe Apfel fängt den Wurm.

M
mathias_f Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

dachte schon ich hätt die ideale Lösung:

public override void BringToFront()
        {
            base.BringToFront();
            RefreshData();
        }

da ich Bringtofront sowieso aufrufen muss, wär auf diese Weise alles ok.

wäre... leider ist Bringtofront nicht abstract bzw virtual.. 😦

mit würds

public virtual void Refresh()

gehen.. aber da hab ich wieder einen Aufruf mehr:

Werde jetzt noch eine Methode probieren:

public void ShowUC()
{
BringToFront();
RefreshData();
}
diese wird aber nicht sichtbar sein wenn ich mit


foreach( Control uc in splitContainer.Panel2.Controls )
            {
                try
                {   
                    if( uc.Tag.ToString() == e.Node.Name )
                    { ...

durchgehe. Sonst müsst ich noch eine abstrakte Klasse BaseUC machen. Oder?

Der Nachtei bei visible bzw show hide ist dass ich explizit alle uc zuerst hiden muss um dann das gewünschte anzuzeigen mit show. sonst ist ein UC möglicherweise visible aber nicht in front 😦