Form modale e restituzione di un valore

martedì 16 dicembre 2008 - 14.33

Teech Profilo | Expert

Ho creato un form che mi visualizza un elenco di valori e visualizzo come Dialog (o modale)
Dim f as New MiaForm f.ShowDialog
In questa form seleziono una voce da un elenco e vorrei che mi venisse restituita sul chiamante il valore selezionato: una cosa tipo:
Dim f as New MiaForm Dim MiaVar As String=f.ShowDialog
E' possibile fare una cosa di questo tipo? Da considerare che il valore sarà un oggetto complesso (una mia classe).


--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

aiedail92 Profilo | Expert

Ciao

Non puoi ritornare il valore come risultato della funzione ShowDialog (a meno che non ne fai l'override nella tua classe), ma puoi sempre implementare una proprietà nella tua Form dove salvare il valore di ritorno.

Luca

Teech Profilo | Expert

Era semplice il concetto, è che il form mi deve restituire un oggetto complesso e devo assegnare alcune proprietà di questo oggetto ad un controllo TextBox... Ho assegnato la TextBox al costruttore della form e con un pò di codice ho risolto...

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Teech Profilo | Expert

Mi sono incartato e non ho notato un problema. La mia situazione è la seguente:
Ho una collection di miei oggetti (Commesse) che viene popolata attraverso delle chiamate ad un DB. Per filtrare devo filtrare i dati di questa collection permettendo all'utente di scegliere il campo ed il valore da filtrare (dalla data commessa alla data commessa, il cliente, l'articolo, ecc...). Per fare ciò ho creato una classe Filtro dove ogni proprietà è un valore che posso usare nella chiamata SQL (fondamentalmente i parametri della stored procedure che restituisce i dati).
A differenza degli oggetti Commessa che hanno anche tipi complessi (Dim c as New Cliente) la classe filtro ha solo tipi "primitivi" (anche se così non è corretto, per capirci) come Integer, String, Double.... Nella Form Commesse ho un DataGridView che mostra i dati della collection preimpostando il filtro a dei valori di default. Per cambiare questo filtro ho creato una Form con vari controlli per i quali ho fatto il binding alle proprietà dellìoggetto filtro. Finchè si tratta di tipi di dato "primitivi" tutto funziona correttamente, ma quando si tratta di oggetti entro in crisi. Metto il codice per essere più chiaro...
Public Class FiltroCommesse '...varie variabili private fra cui... Private _Cliente As String Private _DescrizioneCliente As String '...varie proprietà fra cui... Public Property Cliente() As String Get Return _Cliente End Get Set(ByVal value As String) _Cliente = value End Set End Property Public Property DescrizioneCliente() As String Implements IFiltroCommesse.DescrizioneCliente Get Return _DescrizioneCliente End Get Set(ByVal value As String) _DescrizioneCliente = value End Set End Property End Class
Un'istanza di questa classe viene caricata quando apro il form dove gestisco le commesse. In questo Form posso cambiare questo filtro richiamando un ulteriore form che contiene vari controlli, fra cui un textbox dove viene inserito il cliente (che ho lockato -Locked=True-). Il codice del form è il seguente:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Per popolare la textbox dei clienti richiamo un ulteriore form attraverso la collection dei clienti con la quale li visualizzo tutti. Il fatto è che, per comodità, la form dei clienti espone un DataGridView: il metodo SetControl, nella collection, è il seguente:
Public Class Clienti Inherits BindingList(Of Cliente) Protected _adapter As AdapterClienti Private _filtro As FiltroClienti Sub New() _filtro = New FiltroClienti Try _adapter = New AdapterClienti() Catch ex As Exception Throw ex End Try Popola() End Sub Protected Overridable Sub Popola() For Each cl As IClienteDB In _adapter.GetClienti(_filtro) Me.Items.Add(New Cliente(CType(cl, IClienteDB))) Next End Sub Public Overridable Sub SetControl(ByVal c As System.Windows.Forms.Control) Dim ff As New ListaClientiForm(Me, c) ff.ShowDialog() ff.Dispose() Me.Items.Clear() Popola() End Sub '... Altri metodi, funzioni e proprietà... End Class
Nella form ListaClientiForm ho un DataGridView che mostra tutti i clienti ed ogni riga è un'istanza della classe Cliente. Facendo doppio click sulla riga ottengo il cliente e assegno i dati al TextBox. Il codice che uso nella form ListaClientiForm è il seguente:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Dopo tutto questo macchinoso lavoro ottengo quello che voglio ottenere salvo che quando rientro nel form FiltroCommesseForm la descrizione del Cliente non compare nel textbox (ma il tag è correttamente inizializzato). Temo che ci siano dei problemi nell'assegnazione del Binding, tipo che 2 binding sullo stesso controllo non funzionano (ma non ho trovato documentazione in merito).

Grazie di aver avuto pazienza di leggere tutto!!! Help me
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

Teech Profilo | Expert

Il problema è l'uso dei Tag, non del passaggio dei dati... Anche togliendo il focus alla TextBox si vuota senza un motivo plausibile, mentre se tolgo il Binding al Tag funziona...

Ora studio per vedere se capisco...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
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