Startup secondary Form

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Startup secondary Form

    Hi,

    ich habe hier ein Problem, dass ein wenig kniffelig ist. Ich hoffe, ihr seid wie immer geduldig ! :)

    Ich starte eine Form, nennen wir sie frmTllDisplay ... und von dieser Form aus möchte ich eine andere Form (nennen wir sie frmTllRaw) ansprechen. Dies geschieht mit der Prozedur "LocateStanza".

    frmTllDisplay ---> LocateStanza --> frmTllRaw

    frmTllRaw enthält eine DatagridView, nennen wir sie dgvTllRaw ... in dieser Form möchte ich eine bestimmte Zeile auswählen über den Parameter "Lno" (line number).

    frmTllRaw --> dgvTllRaw.rows(Lno).Select = True

    Das alles ist natürlich KEIN Problem. Aber ... es gibt eine wichtige Anforderung:

    Die frmTllRaw muss nicht gestartet sein. Wenn dies nicht der Fall ist, dann soll sie beim ersten Aufruf der Prozedur "LocateStanza" gestarted werden.

    frmTllDisplay ---> LocateStanza --> autostart "frmTllRawfrmTllRaw" --> dgvTllRaw.rows(Lno).Select = True

    So habe ich die Prozedur "LocateStanza" programmiert:

    VB.NET-Quellcode

    1. If FormTllRaw Is Nothing OrElse FormTllRaw.IsDisposed Then
    2. 'Autoload frmTllRaw
    3. FormTllRaw = New frmTllRaw
    4. FormTllRaw.Show()
    5. End If
    6. 'Locate stanza
    7. FormTllRaw.dgvTllRaw.ClearSelection()
    8. Debug.Print("Count=" & FormTllRaw.dgvTllRaw.Rows.Count.ToString("n0"))
    9. FormTllRaw.dgvTllRaw.Rows(myLno).Selected = True '<-- hier kracht es!
    10. FormTllRaw.dgvTllRaw.FirstDisplayedScrollingRowIndex = myLno
    11. If FormTllRaw.WindowState = FormWindowState.Minimized Then _
    12. FormTllRaw.WindowState = FormWindowState.Normal
    13. FormTllRaw.BringToFront()


    Die StartProzedur der frmTllRaw lädt die DatagridView dgvTllRaw über eine BindingSource.

    VB.NET-Quellcode

    1. Private Sub frmTllRaw_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. lblMessage.Text = ""
    3. If blnDebug Then MenuStrip1.BackColor = DebugColor
    4. Me.Text = "TLL Raw - " & Path.GetFileName(EDITOBJECT)
    5. Dim mySize = New Size(CInt(maxWidth / 2), maxHeight)
    6. Dim myLocation = New Point(0, 0)
    7. Me.Location = myLocation
    8. Me.Size = mySize
    9. End Sub
    10. Private Sub frmTllRaw_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    11. 'Display form ---------------------------------------------------------1
    12. BuildBindingSource(EditData)
    13. DisplaySearch()
    14. DisplayLocate()
    15. End Sub


    Das klappt auch alles ganz wunderbar .. aber nur, wenn die Form frmTllRaw VOR dem Aufruf der Prozedur "LocateStanza" geladen wurde.

    Wenn die frmTllRaw aber über "Autoload frmTllRaw" gestarted wurde, dann kracht es ! Die dgvTllRaw ist noch nicht geladen ... wie der Debug.Print zeigt, ist die DGV noch leer ... und damit gibt es eine Exception beim ... .Select = True

    Offensichtlich läuft "LocateStanze" nach dem FormTllRaw.Show weiter, obwohl die DGV dgvTllRaw noch nicht aufgebaut ist.

    Ich habe versucht nach dem FormTllRaw.Show zu warten (Thread.Sleep(1000)) ... aber auch das hat leider nicht geholfen. :(

    Ich bin mir sicher, dass die Experten wissen, was ich hier falsch mache und vor allem wie ich das beheben kann ... :)

    LG
    Peter

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

    Spekulatius: Das Show und das weitere Bearbeiten der Formdaten klappt nicht in einem Atemzug so, wie Du Dir erhoffst. Du könntest es mit meinem immer wieder gerne verwendeten Workaround probieren:

    VB.NET-Quellcode

    1. Private Async Sub LocateStanze(DeineParameterListe)
    2. If FormTllRaw Is Nothing OrElse FormTllRaw.IsDisposed Then
    3. 'Autoload frmTllRaw
    4. FormTllRaw = New frmTllRaw
    5. FormTllRaw.Show()
    6. Await Threading.Tasks.Task.Delay(1) 'Zeit geben, damit die Load- und Shown-Events gefeuert und verarbeitet werden können
    7. End If
    8. 'Locate stanza
    9. FormTllRaw.dgvTllRaw.ClearSelection()
    10. Debug.Print("Count=" & FormTllRaw.dgvTllRaw.Rows.Count.ToString("n0"))
    11. FormTllRaw.dgvTllRaw.Rows(myLno).Selected = True '<-- hier kracht es!
    12. FormTllRaw.dgvTllRaw.FirstDisplayedScrollingRowIndex = myLno
    13. If FormTllRaw.WindowState = FormWindowState.Minimized Then FormTllRaw.WindowState = FormWindowState.Normal
    14. FormTllRaw.BringToFront()


    btw: bitte Prozeduren immer mit Kopf und Fuß posten.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ich glaub, das einfachste ist, ein Delay einzubauen mit Async:
    Die Methode - leider hast du keine gepostet, sondern nur verlorene zeilen.
    Also die Methode Async markieren, und dann an geeigneter Stelle

    VB.NET-Quellcode

    1. Await Task.Delay(200)
    Thread.Sleep ist derselbe Gedanke, ist aber als Delay ungeeignet.

    mist - zuspät