Usercontrol_Activated - gibt's sowas überhaupt ?

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Schurke.

    Usercontrol_Activated - gibt's sowas überhaupt ?

    'Nabend!

    Ich bin zzt. dabei ein Projekt umzuschreiben.
    Unter anderem werden diverse einzelne Forms jetzt als Usercontrols in ein Form eingebunden.
    (Nachdem ich endlich verstanden habe, wie das funktioniert.. ;) )

    Mein Problem ist jetzt folgendes:

    Ich übergebe nach überprüfen der Login-Daten aus einer MySQL-Datenbank die UserID und Name an das Hauptformular weiter (mittels WriteOnly Property) in welchem die UserID und Name 'Private' sind.
    Ebenso muss ich die UserID auch an die einzelnen UserControls weiter reichen.
    (Falls hier bereits der ein Denkfehler besteht, bitte laut schreien!! Danke!)

    In einem Fall ist es nun so, das in der Usercontrol die ID und der Name als Label angezeigt werden.
    Bisher wollte ich dieses wie folgt lösen:

    VB.NET-Quellcode

    1. Private Sub UserControl_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. lblUserIDVal.Text = myUserID.ToString
    3. End Sub


    Meine UserID in diesem Beispiel müsste eigentlich 2 sein.
    Überprüfung des Werts mittels ausgabe in MessageBoxes habe ich schon durchgeführt.
    Die Werte Stimmen, bis es an den Load-Event kommt. (Dort erhalte ich den Wert "0")

    Ich vermute nun, dass dies daran liegt, dass zu diesem Zeitpunkt der Wert in myUserID noch nicht angekommen ist.

    Für ein normales Formular würde ich nun einfach anstatt Load "Activated" wählen, dann sollten die Werte bereits da sein.
    (Auch hier bitte laut schreien falls falsch!!)
    'Activated' habe ich jetzt aber leider als Event nicht gefunden.

    Vielleicht kann mich jemand nachvollziehen und mir einen Hinweis geben.

    Danke schonmal!
    Schurke

    A-Zid schrieb:

    UserControl_Show ?
    Ähm... ich bin jetzt gerade etwas sprachlos...
    Einen Event Namens _Show gibt's nämlich genau so wenig.
    Und eine Usercontrol zeigt man halt auch nicht mit .Show() an (falls Du das meintest..)

    Mir geht's eigentlich nur darum, den Wert erst dann zuzuweisen, wenn das Usercontrol zum Form geadded wurde.. ;) (fertig "geladen" ist).

    ;)
    hmm, eventuell das onPaint Ereignis abfangen mit einer statischen Variable, damit es nur 1x ausgeführt wird ? Ich gehe davon aus du willst es im Control selber abhandeln ?

    Nicht schön, aber etwas besseres fällt mir gerade nicht ein ...

    Edit: Oder HandleCreated ? passiert ja nur einmal wenn das WindowsHandle existiert

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kangaroo“ ()

    Hi!
    Ist myUserID eine Property? Dann sollte es eigentlich ja egal sein, wo sie aufgerufen wird. Warum eine writeonly-Property? Wie heißt diese?

    Bei den Zuweisungen in folgenden Beispiel habe ich den Konstruktor gewählt (sub New), welche vor eventuellen Subs wie Load, usw. ausgeführt wird. Sogar dort wird der Wert bereits korrekt übergeben...
    Ich vermute den Fehler nicht beim Usercontrol. Deshalb:
    Überprüfung des Werts mittels ausgabe in MessageBoxes habe ich schon durchgeführt.

    Wo (in welcher Sub) hast du diesen Wert abgefragt?
    Ich löse Zuweisungen bei neuen UserControls meist so:

    VB.NET-Quellcode

    1. Public Class uc_whatever
    2. Public Event idHasChanged()
    3. Private _ID As String
    4. Public Property ID() As String
    5. Get
    6. Return _ID
    7. End Get
    8. Set(ByVal value As String)
    9. lblUserIDval.Text = value
    10. If _ID <> value Then RaiseEvent idHasChanged()
    11. _ID = value
    12. End Set
    13. End Property
    14. Sub New()
    15. ' Dieser Aufruf ist für den Designer erforderlich.
    16. InitializeComponent()
    17. ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
    18. ID = ""
    19. End Sub
    20. Sub New(ByVal userID As String)
    21. ' Dieser Aufruf ist für den Designer erforderlich.
    22. InitializeComponent()
    23. ID = userID
    24. End Sub
    25. Private Sub id_changed() Handles MyClass.idHasChanged
    26. 'wird ausgeführt, wenn die property ID einen neuen Wert bekommt.
    27. End Sub
    28. End Class

    Aufruf:
    Ohne Parameter:

    VB.NET-Quellcode

    1. Dim honk As New uc_whatever
    2. '... und dann irgendwann später:
    3. honk.ID = meineID

    Mit Parameter:

    VB.NET-Quellcode

    1. Dim honk As New uc_whatever(meineID)

    Hallo Kurt!

    Kann leider wegen der Zeitverschiebung hier erst jetzt antworten.

    Um es etwas verständlicher zu machen anbei mal mein Code in Auszügen Schritt für Schritt.

    Ich hole mir von einer lokalen MySQL Datenbank einen Satz Userdaten.
    Prüfe diese dann auf Richtigkeit. (Noch sehr simpeles Login. Aber ich bin ja auch noch nicht DER Profi.)
    "LoginForm"

    VB.NET-Quellcode

    1. If pass <> mylib.MD5StrHash(tbPassword.Text) Then
    2. MessageBox.Show("Falsches Passwort oder Benutzername")
    3. tbUsername.Text = ""
    4. tbPassword.Text = ""
    5. tbUsername.Focus()
    6. Else
    7. MsgBox(userID) 'Dient hier zzt. nur zur Überprüfung für mich!!!
    8. Dim MainForm As New frmMain
    9. MainForm.userID = userID
    10. MainForm.connectionString = myConnString
    11. MainForm.username = username
    12. 'Werden von den WriteOnlyProperties aufgenommen
    13. MainForm.Show()
    14. Me.Hide()
    15. Me.Close()
    16. End If

    Das Funktioniert soweit ganz gut.
    Der Username, die userID und der ConnectionString werden ordentlich übergeben.

    Im Mainform sieht das ganze dann wie folgt aus:
    "MainForm"

    VB.NET-Quellcode

    1. Private myUserID As Integer ' userID speichern
    2. ...
    3. ...
    4. Public WriteOnly Property userID() As Integer
    5. Set(ByVal value As Integer)
    6. myUserID = value
    7. End Set
    8. End Property
    9. ...
    10. ...
    11. ...
    12. Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    13. Me.Text += myUserName
    14. Dim TeamViewControl As New ucTeamView
    15. Me.Controls.Add(TeamViewControl)
    16. TeamViewControl.Dock() = DockStyle.Fill
    17. TeamViewControl.userID = myUserID
    18. TeamViewControl.connectionString = myConnString
    19. MsgBox(myUserID) ' Dient ebenfalls nur zur Kontrolle für dieses Problem. ID stimmt auch hier!!
    20. End Sub



    Nachdem nun also das UserControl dem Form hinzugefügt wurde,
    übergebe ich diesem wiederum die userID und den ConnectionString für die weiteren SQL-Querys.

    Hier noch das Codebeispiel aus der UserControl:
    "userControl"

    VB.NET-Quellcode

    1. Private myUserID As Integer ' userID speichern
    2. ...
    3. ...
    4. Public WriteOnly Property userID() As Integer
    5. Set(ByVal value As Integer)
    6. myUserID = value
    7. End Set
    8. End Property
    9. ...
    10. ...
    11. Private Sub ucTeamView_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    12. lblNameVal.Text = myUserID.ToString
    13. End Sub



    So ganz ohne detailliertes Wissen hätte ich jetzt mal behaupten, dass dies gleich deinem Vorgehen währe.
    IST ES ABER NICHT!
    Deinem Beispiel folgend wird der Wert an die Usercontrol übertragen und einwandfrei angezeigt...

    Was ich verstehe, ist dass Du den Wert direkt im Konstruktor mitgibst.
    Und wie ich diese Zeilen schreibe verstehe ich glaube ich auch, warum es bei mir nicht funktioniert hat.
    Der Wert wird ja schließlich erst übergeben, nachdem das UserControl_Load Event bereits durchgeführt ist. (Richtig? ?( )
    Ergo kann die Wertzuweisung an das Label während _Load auch noch keinen Wert übergeben, weil dieser nach der deklaration ja noch 0 ist. (Richtig??)

    Gruß
    Schurke

    PS: "Dim honk As..." -- Sehr geil!!!

    EDIT 1 + 2: Rechtschreibung grausam..