Passare un controllo ByVal ad una classe

martedì 13 novembre 2012 - 12.41
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio 2010

luka82 Profilo | Junior Member

Sto tentando di fare una sorta di verifica se i controlli su di una form hanno subito variazioni rispetto alla fase di caricamento dei dati al loro interno.
L'idea era di salvare lo stato di tutti i controlli della form e poi quando mi serve andrei a fare una verifica dello stato iniziale con lo stato attuale per vedere se ci sono state variazioni (il testo contenuto nella TextBox, gli item di una ListView, il valore selezionato in una ComboBox,...)
solo che per fare questo ho scoperto che non è possibile passare un controllo con ByVal, in quanto viene sempre portato dietro il riferimento al controllo e quindi se vado a fare la verifica mi ritrovo il controllo allo stato attuale(cioè con le modifiche fatte), senza poter fare quindi una verifica delle differenze originale->modificato.
Spero di aver reso l'idea, resto in attesa di eventuali suggerimenti. Grazie

AntCiar Profilo | Expert

Ciao.

ti ho inviato un progettino di esempio
Cristian Barca

bludev Profilo | Newbie

>Sto tentando di fare una sorta di verifica se i controlli su
>di una form hanno subito variazioni rispetto alla fase di caricamento
>dei dati al loro interno.
>L'idea era di salvare lo stato di tutti i controlli della form
>e poi quando mi serve andrei a fare una verifica dello stato
>iniziale con lo stato attuale per vedere se ci sono state variazioni
>(il testo contenuto nella TextBox, gli item di una ListView,
>il valore selezionato in una ComboBox,...)
>solo che per fare questo ho scoperto che non è possibile passare
>un controllo con ByVal, in quanto viene sempre portato dietro
>il riferimento al controllo e quindi se vado a fare la verifica
>mi ritrovo il controllo allo stato attuale(cioè con le modifiche
>fatte), senza poter fare quindi una verifica delle differenze
>originale->modificato.
>Spero di aver reso l'idea, resto in attesa di eventuali suggerimenti.
>Grazie

Un oggetto viene sempre passato come riferimento, mai come valore. Se vuoi conservare una copia di un oggetto dovresti clonarlo, ma tale metodo non è implementato nei controlli standard e quindi tale copia va effettuata a mano, proprietà per proprietà. Una soluzione alternativa potrebbe essere quella di fare una serializzazione e una deserializzazione del controllo, ma anche questa strada sembra poco praticabile in quanto i controlli non sono facilmente serializzabili.
Credo comunque che il tuo approccio al problema non sia corretto: che senso ha salvare tutte le proprietà di una textbox quando l'utente può modificare solamente il testo inserito? Sarebbe uno spreco inutile di memoria. Secondo me dovresti pensare a qualcosa di alternativo, come ad esempio l'evento TextChanged tramite il quale puoi settare un flag da valutare successivamente.
---
Fabio Turrin - Bludev - http://www.bludev.it/

Vinsent Profilo | Senior Member

>Credo comunque che il tuo approccio al problema non sia corretto:
>che senso ha salvare tutte le proprietà di una textbox quando
>l'utente può modificare solamente il testo inserito? Sarebbe
>uno spreco inutile di memoria. Secondo me dovresti pensare a
>qualcosa di alternativo, come ad esempio l'evento TextChanged
>tramite il quale puoi settare un flag da valutare successivamente.
>---
>Fabio Turrin - Bludev - http://www.bludev.it/

Concordo...si potrebbe usare la proprietà Tag dei singoli controlli a cui si può associare un pò tutto...il controllo stesso, una variabile o del testo come un banale true/false da impostare alla modifica del controllo stesso.
Ad esempio, con una textbox o una checkbox:
Private Sub Form1_Load() Handles MyBase.Load CheckBox1.Checked = True CheckBox1.Tag = CheckBox1.CheckState TextBox1.Tag = TextBox1.Text End Sub Private Sub verificaTbox() If TextBox1.Tag.Equals(TextBox1.Text) Then Console.WriteLine("ok") Else Console.WriteLine("ko") End If End Sub Private Sub verificaCbox() If CheckBox1.Tag.Equals(CheckBox1.CheckState) Then Console.WriteLine("ok") Else Console.WriteLine("ko") End If End Sub

Per controlli/verifiche più complessi credo sia meglio usare dei custom control in modo da avere proprietà e routine adeguate...
Ciao!

luka82 Profilo | Junior Member

Si ok, per i controlli "semplici"(TextBox, ComboBox, CheckBox) avevo optato per il semplice salvataggio del valore, dello stato(anche se non nel Tag che vorrei lasciare inutilizzato per altre eventualità), il problema è nato per la ListView(DataGridView). A questo punto dovrei optare per un controllo utente(come suggerito), nel quale prevedere tutte le funzioni personalizzate per questi controlli e al suo interno mettere una Proprietà "IsDirty" che mi vado a settare direttamente al suo interno(in base all'aggiunta di altri items, Drag&Drop, CANC e quant'altro).
Altrettanto con il progetto di esempio gentilmente postato da AntCiar non va bene per i controlli complessi come la ListView, anche se molto pulito a livello di codice.
Concordate?
Grazie a tutti.

alextyx Profilo | Expert

Prima di scartare il TAG, considera che puoi salvarci qualunque oggetto anche una classse che contiene (o eredita se più semplice) quello che serviva a te, con in più la proprietà 'IsDirty'.
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5