Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482

    [.NET] Form MDI & Proprietà Owner

    In un form MDI (Form1) apro al suo interno un'altro form (Form2), da questo ne apro un'altro(Form3) al quale imposto la prop. Owner a Form2. Il problema è che se chiudo form2 form3 rimane aperto. Se invece form3 viene aperto all'esterno di Form1(il contenitore) tutto funziona correttamente.
    In pratica se a form3 non imposto la prop. MdiParent tutto fila liscio.

    Che faccio?

    Hey hey, my my Rock and roll can never die!

  2. #2
    Ho simulato il tuo problema creando Form1 (IsMDIContainer = True), Form2 e Form3
    Ecco il codice:
    codice:
    'in Form1
    Private Sub MenuItem2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
        Dim f As New Form2
    
        f.MdiParent = Me
    
        f.Show()
    End Sub
    
    'in Form2
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As New Form3
    
        f.Owner = Me
        f.MdiParent = Me.MdiParent
    
        f.Show()
    End Sub
    In effetti il Form3 appare correttamente come mdi_child, ma sembra ignorare la proprietà Owner. Infatti, chiudendo l'instanza di Form2 che dovrebbe "comandare" Form3, quest'ultimo rimane tranquillamente aperto.
    Ho cambiato di posto due righe:
    codice:
    'in Form2
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f As New Form3
    
        f.MdiParent = Me.MdiParent
        f.Owner = Me
    
        f.Show()
    End Sub
    e stavolta appare il seguente errore: Non top level controls cannot have an owner.
    In pratica, sembra che le finestre mdi_child siano considerate di tipo "non top level" e che ad esse non sia consentito avere un owner. Effettivamente tale discorso non fa una piega, in quanto una finestra child è già "posseduta" da un form MDI, aggiungere un ulteriore proprietario (con la propriatà Owner) renderebbe il form conteso da due diversi proprietari che potrebbero litigare tra di loro (!). Scusa il discorso aggrovigliato, spero cmq di essere stato sufficientemente chiaro, ciao
    Chi non cerca trova.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482
    Infatti ma io come risolvo?

    Hey hey, my my Rock and roll can never die!

  4. #4
    Memorizza l'instanza di Form3 in un membro privato di Form2 e utilizzala quando stai per chiudere Form2:
    codice:
    'in form2
    Private f As Form3
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        f = New Form3
        f.MdiParent = Me.MdiParent
    
        f.Show()
    End Sub
    
    Private Sub Form2_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        f.Close()
    End Sub
    Chi non cerca trova.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    261
    Buona l'idea di Tas, non l'ho provata ma mi sembra funzionante, però così di primo acchito provo a darti anch'io una soluzione, non l’ho provata, potrebbe essere una str.....a quindi prendila come si dice “As Is”. Prova ad usare la tanto decantata ereditarietà in questo caso l’ereditarietà dei form, in modo che i gestori di eventi specificati nel form di base lavorino automaticamente allo stesso modo nel form ereditato.
    Per esempio se tu hai un pulsante che sul form di base gestisce un evento , il pulsante che si trova sul form ereditato chiamerà il gestore di evento nella classe base, quindi aggiungendo un gestore di evento nella classe ereditata per un componente della classe base, entrambi i gestori vengono lanciati, nell’ordine : prima viene lanciato il gestore di evento della classe di base e poi quello della classe ereditata, quindi dovresti riuscire a controllare dal form base il form ereditato. Naturalmente potresti ridefinire un gestore di evento nel form di base creando un nuovo metodo nella classe ereditata usando la parola chiave Overridable. .... Spero di essere stato abbastanza chiaro.

  6. #6
    Non ho ancora capito che c'entra l'ereditarietà scusami.
    Il dubbio non è piacevole, ma la certezza è ridicola. Solo gli imbecilli son sicuri di ciò che dicono.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.