Passare variabile da un form all'altro

venerdì 13 novembre 2009 - 00.58

gianbe Profilo | Newbie

Salve, molto brevemente:
ho due form A e B, nel form A recupero il valore dell' id_ordine di un DataGridView con il seguente codice:

Dim id_ordine As Integer
Dim indice As Integer = DataGridView1.CurrentRow.Index
'qua mi trovo l'id della riga selezionata
id_ordine = DataGridView1(0, indice).Value.ToString '(0 indica la prima colonna della datagridview)

--------------------------------------------------------------------------------------------------------------------

A questo punto vorrei passare la varibile id_ordine al form B...come faccio?
Esssendo un neofita sto impazzendo...qualcuno può aiutarmi?
Grazie

AntCiar Profilo | Expert

Ciao.

Allora:

Nella form B inserisci il seguente codice:

Dim _idOrd As Integer = 0
Public Property IdOrdine() As Integer
Get
Return Me._idOrd
End Get
Set(ByVal value As Integer)
Me._idOrd = value
End Set
End Property


poi nella form A dopo il tuo codice per recuperare l'idOrdine dalla gridView inserisci questo altro pezzo di codice

dim frmSec as "B" = new "B" (al termine "B" devi sostituire il nome della tua form)
frmSec.IdOrdine = "qui metti la tua variabile di id Ordine togliendo anche i doppi apici"
frmSec.ShowDialog(me)


Ciao ciao
Cristian Barca

Teech Profilo | Expert

Per mantenere una maggiore scalabilità ti propongo una soluzione alternativa:

Passi al costruttore del Form B il tuo ID e lo assegni ad una variabile privata da esporre con una proprietà in modalità ReadOnly
Public Class FormB Private m_id as Integer 'Variabile privata 'Costruttore Sub New(ID as Integer) m_id=ID End Sub Public ReadOnly Property ID() As Integer Get Return m_id End Get End Property End Class
A questo punto nel form A, quando istanzi l'oggetto FormB puoi operare nel seguente modo:
Dim fm As New FormB(TuoId) fm.ShowDialog

Se sei alle prime armi ti consiglio di studiare un po' i principi della programmazione OOP sui quali si basa tutto il .NET Framework e vedere bene cosa sono e da cosa si compongono le Classi. Non prenderlo come un atteggiamento supponente, ma un consiglio che ti permette poi di pensare ai programmi in ottica OOP: un form è una classe tanto quanto le altre ma ha dei comportamenti e delle proprietà specifiche...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

gianbe Profilo | Newbie

Grazie per la disponibilità ad entrambi.
Ho testato il codice di Cristian e finalmente sono riuscito ad ottenere quello che volevo...tutto funziona perfettamente.

Per conoscenza personale ho provato anche il codice di Maurizio ma ho qualche problema, sicuramente per mia incompetenza.
Ecco quello che ho fatto, ditemi se è corretto:
- ho copiato il codice seguente nella Form A:

Public Class Form2
Private m_id As Integer 'Variabile privata

'Costruttore
Sub New(ByVal id_ordine As Integer)
m_id = id_ordine
End Sub

Public ReadOnly Property id_ordine() As Integer
Get
Return m_id
End Get
End Property
End Class
...., poi nell'evento CellDoubleClick


Dim fm As New Form2(id_ordine)
fm.ShowDialog()
..........................

Ottengo il seguente errore su fm.ShowDialog(): 'ShowDialog' non è un membro di 'Agenti_2010_V2.inserimento_ordine.Form2'

Dove sbaglio ?

Infine volevo chiedere a Maurizio, se esistono tutorial o testi per approcciarmi a VB.NET e alla programmazione ad oggetti.

Grazie

Teech Profilo | Expert

Sembra un problema di Namespace...
I Form sono nello stesso assembly (progetto)? Se non lo sono devi innanzitutto referenziare l'assembly che contiene il form2 nell'assembly che contiene il form1 e poi importare il namespace con la clausola 'Imports' (listato 1) o utilizzando l'intero namespace quando istanzi la variabile (listato2)

Listato1
Imports Agenti_2010_V2.inserimento_ordine Public Class TuaClasse ... Private Sub CellDoubleClick... Dim fm As New Form2(id_ordine) fm.ShowDialog() End Sub ... End Class

Listato2
Public Class TuaClasse ... Private Sub CellDoubleClick... Dim fm As New Agenti_2010_V2.inserimento_ordine.Form2(id_ordine) fm.ShowDialog() End Sub ... End Class

Per ciò che riguarda tutorial e testi, ce ne sono a centinaia... Per i tutorial non saprei consigliarti, meglio cercare articoli specifici sul web sui vari argomenti, mentre per i libri, dipende anche dalla versione del framework che usi: attualmente sarebbe meglio usare la versione 3.5 dove sono state introdotte diverse tecnologie (WCF, WPF, LINQ, WF, ecc...) e onestamente non conosco testi specifici (uso ancora il framework 2.0).
Per il framework 2.0 io ho usato e uso ancora molto il testo di Balena "Programmare Microsoft Visual Basic 2005 - Il linguaggio e il framework" che offre ottimi spunti sulle funzionalità del framework e della programmazione OOP. Di questo testo ne esiste una versione ridotta ed economica ma comunque adatta per iniziare che si chiama "Visual Basic .NET Nozioni di base I Portatili"...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alexmed Profilo | Guru

Ciao
Vi posto anche la soluzione che adotto io:

Dichiaro pubblica la variabile da passare, quindi il codice del Form1 sarà:

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

Poi nel secondo form richiama direttamente la variabile:

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

Ciao






alexmed

Teech Profilo | Expert

Io preferisco usare il costruttore per una questione di scalabilità: un domani, se volessi usare Form2 in un'altra applicazione, usando le proprietà dovrei portarmi dietro anche Form1 o quantomeno costruirmi una Form1 mantenendo la struttura originaria senza sapere esattamente quali proprietà sono necessarie al funzionamento di Form2... Nella soluzione che utilizza i costruttori è sufficiente passare un dato e la logica della form2 continuerà a funzionare indipendentemente da chi passa il valore.
Per passare più dati in modo strutturato è sufficiente crearsi un'interfaccia e passare al costruttore l'interfaccia (metodo ancora più scalabile).
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alexmed Profilo | Guru

Sono d'accordo con tè.
Dipende molto anche dal livello di preparazione che uno ha.
Ho voluto solo dare, forse, la soluzione più semplice visto che ha affermato di essere neofita.

Ciao

alexmed

gianbe Profilo | Newbie

Grazie anche ad Alex...,
per Maurizio continuo ad avere problemi sul "fm.ShowDialog()", le due form sono entrambe nello stesso progetto quindi non c'è bisogno di imports.
In ogni caso utilizzerò momentaneamente le soluzioni dei tuoi colleghi, anche se non permettono scalabilità, appena ci capisco qualcosa in più ritenterò con la tua.
Saluti
Gianni
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