[VS2005] Passaggio variabile da un form all'altro

mercoledì 03 settembre 2008 - 10.54

gdlcore Profilo | Junior Member

Ciao a tutti ho un problema..
Io dovrei fare in modo di utilizzare in un form una variabile che è stata utilizzata in un altro.
In pratica dopo aver fatto un doppio click su un datagrid contenente dei prodotti, mi esce fuori un altro miniform che mi chiede la quantità, io inserisco il numero e schiacciando ok mi si chiude il miniform. Ora quel numero (quantita) lo voglio utilizzare, ma nel form del datagrid nn so come richiamare quella variabile..
COme faccio?
Aspetto vostra risposta, grazie a tutti!

SSUPERPIPPO Profilo | Guru

>Ciao a tutti ho un problema..

Ciao

>Io dovrei fare in modo di utilizzare in un form una variabile
>che è stata utilizzata in un altro.
>In pratica dopo aver fatto un doppio click su un datagrid contenente
>dei prodotti, mi esce fuori un altro miniform che mi chiede la
>quantità, io inserisco il numero e schiacciando ok mi si chiude
>il miniform. Ora quel numero (quantita) lo voglio utilizzare,
>ma nel form del datagrid nn so come richiamare quella variabile..
>COme faccio?
>Aspetto vostra risposta, grazie a tutti!

Un modo potrebbe essere questo:

1. Crei un oggetto TextBox nel form chiamante

Dim Txt as new TextBox

2. Nel 'miniform' dichieri una variabile di tipo TextBox che dovrà ricevere l'oggetto TextBox della form chiamante

Dim Txt as TextBox

3. Quando istanzi la 'miniform', gli passi l'oggetto TextBox creato

Dim FrmMiniForm as new miniForm
FrmMiniForm.Txt = Txt

4. Ora nella miniform, prima della chiusura, andrai a memorizzare il valore inserito in Txt

Txt="ValoreInserito"

5. Alla chiusura della miniForm ti ritrovi il valore caricato nell'oggetto TextBox che hai creato nella form chiamante.

Spero di essere stato abbastanza chiaro, ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

sanbiz Profilo | Senior Member

>Io dovrei fare in modo di utilizzare in un form una variabile
>che è stata utilizzata in un altro.
>In pratica dopo aver fatto un doppio click su un datagrid contenente
>dei prodotti, mi esce fuori un altro miniform che mi chiede la
>quantità, io inserisco il numero e schiacciando ok mi si chiude
>il miniform. Ora quel numero (quantita) lo voglio utilizzare,
>ma nel form del datagrid nn so come richiamare quella variabile..

Ci possono essere due strade, molto semplici.
La prima la puoi usare solo se il tuo miniform ha un oggetto nel quale memorizza il valore inserito (ad esempio una textbox).

Esempio 1
----------
Probabilmente dalla griglia apri il "MiniForm" in modale quindi una cosa tipo questa:

Private Sub Griglia_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim newForm as new miniForm
newfrm.ShowDialog
End Sub

A questo punto quando chiudi il newForm (miniform) userai il comando me.close che restituisce il controllo al form chiamante (quello con la griglia per intenderci)
Nella routine precedente andrai a leggerti il valore dell'oggetto TextBox dove avevi digitato la quantità:
Private Sub Griglia_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim newFrm as new miniForm
newFrm.ShowDialog
'
' Vado a leggere il valore
'
Debug.Print newFrm.TextBox1.text
'
' Poi vai a distruggere il form
'
newFrm.Dispose
End Sub


Esempio 2
----------
Altro sistema che non sottovaluterei è quello di aggiungere delle Property sul tuo MiniForm, una cosa del genere

Public ReadOnly Property ValoreDigitato() As String
Get
'
' Qui posso restituire tutto quello che voglio, sia il valore di una variabile che il contenuto di una
' TextBox o di una Label ecc. ecc.
'
Return ValoreCheAvevoDigitato
End Get
End Property

A questo punto dal form chiamante accederai alle informazioni semplicemente richiamando la proprietà ValoreDigitato del form.

Private Sub Griglia_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim newFrm as new miniForm
newFrm.ShowDialog
'
' Vado a leggere il valore
'
Debug.Print newFrm.ValoreDigitato
'
' Poi vai a distruggere il form
'
newFrm.Dispose
End Sub

L'esempio è stato fatto con una Property in sola lettura, ma tu puoi farlo anche in lettura/scrittura o il sola lettura in modo da fornire alla tua form anche il valore iniziale ad esempio.
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

gdlcore Profilo | Junior Member

Ciao la tua risposta è perfetta, funziona, ma come mai mi scive solamente su una riga? COntinua a scrivere continuamente sullo stesso record della tabella, come posso far incrementare la riga?
Aspetto tua risposta, grazie mille..

sanbiz Profilo | Senior Member

>Ciao la tua risposta è perfetta, funziona, ma come mai mi scive
>solamente su una riga? COntinua a scrivere continuamente sullo
>stesso record della tabella, come posso far incrementare la riga?

Non riesco a capire... posta il codice se riesci.

--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

gdlcore Profilo | Junior Member

Questo è il codice..in pratica mi scrive sempre sullo stesso record..

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

Grazie ancora

sanbiz Profilo | Senior Member

>Questo è il codice..in pratica mi scrive sempre sullo stesso
>record..

Perdonami, ma la tua query di aggiornamento non specifica una clausola "Where" per discriminare il record. Fa un Update di tutti i record della tabella.

> "UPDATE Carrello SET Descrizione = '" & var1 & " - " & var3 & "', Quantita= '" & qta & "'"


--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

slackewix Profilo | Newbie

ciao, c'è anche un'altra strada per passare una variabile da un form ad un altro:
nel miniform che devi aprire inserisci la variabile con necessaria per l'apertura del form, in questo modo:

string sTesto;
public miniForm(string strTesto)
{
InitializeComponent();
sTesto = strTesto;
}

quando apri il miniform lo apri così:
miniForm oForm = new miniForm(sTesto);
oForm.Show();

dove in questo caso sTesto è uguale al testo della tua textbox. In questo modo quando apri il miniform la variabile sTesto può essere utilizzata per tutto il form.

sergio58 Profilo | Junior Member

Scusa slackewix , quest'ultmo metodo si può applcare anche tra i FormChid di un formMDI?,
Perchè dovrei passare una variabile da un form figlio ad un form anteprima di stampa ma non ci riesco.
Credo che la prima parte del codice dovrebbe essre inserita nel form anteprima
Potresti tradurmi in VB2005 il codice ?Grazie Sergio

slackewix Profilo | Newbie

si, si può applicare tra qualunque form senza problemi, da mdi a child oppure da child a child. il codice in vb dovrebbe essere qualcosa di simile (non uso il vb da qualche anno ormai, quindi non prenderlo troppo per buono)

Dim sTesto As String
publicminiForm(strTesto As String)
InitializeComponent
sTesto = strTesto

Dim oForm As miniForm = New miniForm(sTesto)
oForm.Show

Il concetto di per sè è molto semplice: supponiamo che tu abbia una griglia di ricerca articoli così strutturata:
IDARTICOLO | CODICE | DESCRIZIONE

E poi hai costruito un form separato per la modifica di tutte le informazioni correlate. Nel momento in cui l'utente seleziona la riga sulla griglia, tu prendi l'IDARTICOLO della riga e lo passi come variabile al form di modifica, inserendo la variabile nella chiamata del form (nel nostro codice sopra sarebbe: Dim oForm As miniForm = New miniForm(sTesto) dove sTesto è naturalmente la variabile che può essere stringa come in questo caso, ma in realtà di qualunque tipo, integer, datetime ecc). Quando il tuo form di modifica si aprirà, la variabile verrà trasmessa a livello globale per tutto il form, il che significa che tu potrai caricare i record, modificarli, salvarli e fare qualunque altra operazione ed avrai sempre l'IDARTICOLO a disposizione in qualunque punto del form.

Se invece devi fare il contrario, cioè passare una variabile da un form child ad un form mdi, la cosa cambia. Il metodo sopra citato funziona quando devi creare una nuova istanza di un form. Del form mdi in genere si crea una sola istanza (se tu ricreassi l'istanza dell'MDI tutte le volte allora funzionerebbe anche il metodo di cui sopra). Se devi passare una variabile indietro ad un form mdi puoi sempre creare una variabile pubblica.
Metti questo nel form MDI:

public static string sTesto;

dal tuo form child puoi tranquillamente accedere alla variabile in questo modo:

frmMDI.sTesto = strTesto;

Ovviamente questo metodo funziona anche tra mdi e child e child e child, al posto di quello sopra.
Spero di esserti stato d'aiuto.

sergio58 Profilo | Junior Member

Il ragionamento è giusto, purtroppo in pratica credo che le cose stiano un pò diversamente.Ti spiego meglio quello che ho fatto:
In frmAnteprima ho inserito il codice che mi hai passato modificandolo in questa maniera:
Public Sub New(ByVal strTesto As String)
InitializeComponent()
Me.lblPagine.Text = strTesto
End Sub
(questo già c'era)
Public Sub New(ByVal documento As Printing.PrintDocument)
InitializeComponent()
Me.PrintPreviewControl2.Document = documento
End Sub
Nel form figlio chiamante ho dichiarato:
Private Documento As Printing.PrintDocument
Private sTesto As String
Nel Botton del form figlio c'è il seguente codice:
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStampa.Click
Documento = New Printing.PrintDocument
AddHandler Documento.PrintPage, AddressOf prtAllegatiCli_PrintPage
Dim anteprimaCli As New frmAnteprimaAllegati(Documento)
anteprimaCli.ShowDialog()
End Sub
Nella rutine print di stampa , alla fine ho inserito:
sTesto = 3
Dim Anteprima As New frmAnteprimaAllegati(sTesto)

Ho eseguito il debug, quando il controllo passa alla routine Public Sub New (strTesto),il valore di strTesto è effettivante uguale a 3.
Segno che il passaggio del valore è avvenuto,però quando appare il form, la label è vuota.
ho fatto diverse altre prove a togliere lo .ShowDialog in Butto2 ed inserendolo dopo avere instanziato Anteprima nella rutine di stampa, ma così si blocca. Potresti dirmi una tua opinione?
Grazie, Sergio

SSUPERPIPPO Profilo | Guru

Ciao, scusa se mi intrometto.

Devi dichiarare una variabile a livello di Form nel form al quale passi il parametro:

Dim StrTestoPassato as String

e nel costruttore vai ad inizializzarlo con il valore passato

> Public Sub New(ByVal strTesto As String)
> InitializeComponent()
StrTestoPassato=strTesto
> End Sub

nell'evento Load del form aggiungi poi

TuaLabel.text=StrTestoPassato

Ciao

Ale

http://blogs.dotnethell.it/alebadalin

sergio58 Profilo | Junior Member

Mi dovete scuare se vi deludo,ho fatto tutto come mi avete detto, il valore viene passato , ma non viene visualizzato, se non mi credete fate una prova.
Grazie comunque per la buona volontà nell'aiutarmi.
Sergio

slackewix Profilo | Newbie

posto il fatto che non mi è mai capitato, hai provato facendo un refresh del controllo dopo aver ugualizzato il testo alla variabile?

sergio58 Profilo | Junior Member

Ho inserito :
Public Sub New(ByVal strTesto As String)
InitializeComponent()
strTestoPassato = strTesto
lblPagine.Refresh()
visualizza()
End Sub
per essere più sicuro ho inserito la subroutine visualizza
Private Sub visualizza()
lblPagine.Text = strTestoPassato
End Sub
Nella routine strTestoPassato assume il valore impostato nell'altro form.L'ho controllato in fase di debug, ma non appare nella label.
Successivamente, schiacciando il pulsante avanti (routine seguente), mi dà errore perchè non trova nella label il valore.
Private Sub btnPaginaAvanti_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPaginaAvanti.Click
Dim intPaginaAttuale As Integer
Dim intMaxPagine As Integer
intMaxPagine = CInt(lblPagine.Text)'errore al tipo integer
intPaginaAttuale = CInt(lblPaginaAttuale.Text)
intPaginaAttuale = intPaginaAttuale + 1
If intPaginaAttuale > intMaxPagine Then
Exit Sub
End If
lblPaginaAttuale.Text = intPaginaAttuale
PrintPreviewControl2_VisibleChanged(sender, e)
End Sub
Non sò più cosa pensare.
Ti ringrazio se mi puoi dare qualche altra illuminazione.
Sergio.

slackewix Profilo | Newbie

io organizzerei solo il codice in modo differente:

Public Sub New(ByVal strTesto As String) InitializeComponent() strTestoPassato = strTesto End Sub

poi nel form load inserisci:

visualizza() lblPagine.Refresh() 'il refresh lo devi fare dopo il visualizza; 'se lo fai prima la variabile strTesto non è ancora stata passata alla label


dante Profilo | Junior Member

dichiari una variabile pubblica e gli passi il dato:

nella miniform dichiari:

public MiaVariabile as MioTipo

Nella form principale, quando richiami la miniform:

dim f as new miniform f.MiaVariabile= dato che vuoi passare f.show

Dante



sergio58 Profilo | Junior Member

Ti ringrazio per l'interessamento , ma quel codice non può funzionare perchè il miniform (che sarebbe il frmAnteprima) che riceve il valore, ha una Public sub New(byval documento as printing.printdocument) che serve ad attivare la routine di stampa presente nel form figlio del FormMDI.
Per cui quando lo instanzio debbo fare obbligatoriamente : Dim anteprimaFor As New frmAnteprimaAllegati(Documento)
Se lo instanzio di nuovo , mi chiede sempre il nome di una routine da inserire al posto di Documento, altrimenti mi dà errore.
Dall'idea che mi sono fatto il problema è nel button che invia il comando per la stampa , perchè una volta che il form è attivato non visualizza più valori , anche se gli vengono passati.Si dovrebbe inserire il codice che instanzia il frmAnteprima alla fine di printdocument.printpage. Ma non so come lanciare la routine.
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

dante Profilo | Junior Member

Probabilmente è una cazzata, ma non è che il problema è nella with della label? oppure nel suo posizionamento?
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5