VB.NET - Problema apertura form Child

giovedì 03 luglio 2008 - 09.54

Sk3l3t0n Profilo | Newbie

Ciao a tutti, il mio problema è il seguente:

ho un'applicazione con delle form Child che si aprono regolarmente la prima volta che le richiamo, ma se
provo a richiamarle nuovamente dopo averle chiuse con il tasto X mi ritorna il seguente errore:

"Impossibile accedere a un oggetto eliminato.
Nome oggetto: 'InserimentoCarico'."

Il codice nel bottone chiamante è:

For Each f As Form In Me.MdiChildren If CStr(f.Tag) = "InserimentoCarico" Then f.BringToFront() Exit Sub End If Next 'f Insert_Carico.Tag = "InserimentoCarico" Insert_Carico.MdiParent = Me Insert_Carico.Show()

Mentre in un modulo:
Public Insert_Carico As New InserimentoCarico()

Come faccio quindi a far in modo che la Child si apra anche la seconda volta che la richiamo?
Magari la mia domanda è banale per voi, ma io mi sono avvicinato solo da un paio di mesi al VB....

P.S. Spero di non aver ripreso argomenti già trattati ma credetemi che ho girato in lungo e in largo senza trovare/capire
la soluzione....

Vi ringrazio anticipatamente

aiedail92 Profilo | Expert

Ciao

Il problema è che quando clicki sul tasto chiudi di una form, essa viene automaticamente "distrutta", e non è quindi più possibile utilizzarla.

Puoi ovviare in due modi:

1) Gestisci l'evento FormClosing e da lì annulli la chiusura del Form e lo nascondi soltanto
2) Crei ogni volta un nuovo Form con l'operatore New

Ti consiglio la prima opzione, qui c'è un esempio:

'Gestisci l'evento FormClosing (usa un AddHandler quando aggiungi il Child al Parent): 'AddHandler Insert_Carico.FormClosing, AddressOf Insert_Carico_FormClosing Private Sub Insert_Carico_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) If e.CloseReason <> CloseReason.MdiFormClosing Then 'Annullo la chiusura e.Cancel = True 'nascondo il Form CType(sender, Form).Visible = False End If End Sub

Luca

Sk3l3t0n Profilo | Newbie

Ti ringrazio molto per la velocità di risposta. A dirti la verità avevo pensato anche io di nascondere il form ma ogni volta che lo richiamavo mi "sembrava" ne aprisse
uno nuovo (quindi pensavo di avere aperti tanti form quanti ne nascondevo)

Appena possibile provo e poi ti faccio sapere...

Ma spiegami una cosa: come mai chiudendo la finestra essa si distrugge e richiamandola nuovamente non si riapre?
Cliccando sul pulsante non dovrebbe aprire un nuovo child?


Grassssssieeee.....

aiedail92 Profilo | Expert

Una Form viene creata quando viene chiamato il costruttore, in quel momento viene creata la finestra. Quando viene chiusa, la finestra cessa di esistere (il suo Handle non è più valido), quindi per poterla usare nuovamente hai bisogno di creare un nuovo Handle per la finestra, cosa che puoi fare col metodo protetto RecreateHandle() per mantenere la finestra, oppure chiamando nuovamente il costruttore. Il metodo Show() invece non fa altro che visualizzare una finestra già esistente, ma se l'Handle non è valido perchè la finestra è stata chiusa, l'azione non può essere compiuta, e vengono generate delle eccezioni (ObjectDisposedException)

Luca

Sk3l3t0n Profilo | Newbie

Ho provato il tuo codice....ho creato la "formclosing", ho inserito l'addHandler nel bottone chiamante ma niente. Adesso però, la seconda volta che richiamo la form,
invece di generarmi l'errore non fa nulla. Il bottone è come se non avesse codice...

HELLLLLPPPPPP......

Grazie per la pazienza

aiedail92 Profilo | Expert

Prova a postare il codice interessato...

Luca

Sk3l3t0n Profilo | Newbie

Sono completamente nel pallone....mi è venuto perfino mal di testa...

Allora, questo nel bottone chiamante:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

E questo nel modulo:

Public ListViewxxx As New ListView()


P.s. prima non ho spiegato bene, ma la form figlia deve sempre essere interna al form padre

aiedail92 Profilo | Expert

L'handler per l'evento prova ad aggiungerlo in un metodo che venga chiamato una sola volta, e all'avvio dell'applicazione. Infatti se aggiungi il gestore eventi dopo che l'evento si è verificato, ormai lo hai "perso", quindi nel tuo caso la chiusura non viene annullata. Prova a spostare l'AddHandler così:

Private Sub tuaForm_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load AddHandler ListViewxxx.FormClosing, AddressOf ListViewxxx_FormClosing End Sub

Oppure dichiara ListViewxxx come WithEvents:

Public WithEvents ListViewxxx As New ListView()

e aggiungi il gestore direttamente al metodo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Mi viene ora una domanda: ma la ListViewxxx è una ListView o una Form??

Luca

Sk3l3t0n Profilo | Newbie

ListViewxxx è una form di "prova" contenente una listview. Mi sono messo a provare lì il codice per non rovinare il progetto originale.
Cmq ho provato ma niente da fare, continua ad "uccidermi" la Form (e quindi non riesco piu a riaprirla)...

Aspetta, provo a dirti piu o meno perchè mi sereve che il programma faccia ciò (magari c'è un'altra soluzione alla base)

Allora, io ho 3 Form: Form ---> Child1 ---> Child2 (che si chiamano a cascata)
La Child2 contiene una listview che deve ritornare un valore in una textbox nella Child1 ---> usando delle form normali nessun problema, ma
mettendo parenti e figli è diventato un casino perchè il valore non veniva passato. Inizialmente il codice nel bottone chiamante era:

For Each f As Form In Me.MdiChildren If CStr(f.Tag) = "ListView" Then f.BringToFront() Exit Sub End If Next 'f Dim ListViewxxx As New ListView() ListViewxxx.Tag = "ListView" 'you get the idea: each type of form will get its own tag ListViewxxx.MdiParent = Me ListViewxxx.Show()

Però per far si che la Child2 scrivesse il valore nella Textbox della Child1 ho dovuto "passare" il "Dim ListViewxxx As New ListView()"
in un modulo. Così facendo funziona tutto a parte che la form si apre una volta sola....

Secondo te ho sbagliato in partenza spostando quella riga di codice?

aiedail92 Profilo | Expert

Ciao

Finalmente ho capito dove è l'errore: nel codice del bottone per mostrare la Form tu usi f.BringToFront, che però non ha nessun effetto se la Form non è visibile. Quindi prima di chiamare f.BringToFront, aggiungi una chiamata a f.Show, e il problema dovrebbe essere risolto.

Luca

Sk3l3t0n Profilo | Newbie

SEI UN GENIO!!!!

Io un po' pollo.....

Grazie mille per il tuo aiuto.....e ribadisco per la pazienza....

Un'ultima domanda: che guide mi consigleresti per VB.net? Io vado avanti sui link MSDN e su una guida in pdf trovata on line....

Ciao, Valerio

aiedail92 Profilo | Expert

La guida con cui ho iniziato io è un libro pubblicato da Mondandori Informatica, si chiama Microsoft Visual Basic 2005 Passo per Passo.

È una guida molto basilare, se già sai qualcosa non serve praticamente a niente. Della stessa serie esiste anche Programmazione Microsoft Visual Basic 2005, Le Basi della Programmazione, che dovrebbe (dico dovrebbe perchè non ce l'ho) fornire delle competenze di livello più avanzato.

Questi sono i link sul sito della Mondadori:

http://education.mondadori.it/libri/schedalibro.asp?idlibro=88-04-54137-7
http://education.mondadori.it/Libri/SchedaLibro.asp?IdLibro=88-04-54135-0

Luca

Sk3l3t0n Profilo | Newbie

Ok, ti ringrazio anche per questo suggerimento....
Spero di non doverti piu disturbare, ma non ne sono tanto sicuro

Grazie e buona serata....

Ciao ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5