AIUTO!!! PROBLEMA AGGIORNAMENTO PROPRIETA' DI UN CONTROLLO PERSONALIZZ...

sabato 26 maggio 2007 - 21.40

SSUPERPIPPO Profilo | Guru

Mi stò scontrando con questo problema:

Ho creato un controllo personalizzato in VB.NET con due proprietà, una che restituisce un valore integer denominata DISTANZA ed una che restituisce un oggetto che ho creato ad hoc e che viene gestito da una finestra di dialogo personalizzata per l'assegnazione di diverse proprietà, denominata COLONNE.

Il mio preblema è questo:

Quando inserisco il controllo nella form e modifico in Designtime la proprietà DISTANZA (Integer), tutto funziona per il meglio, se salvo e riapro la forms mi ha salvato la proprietà. Quando invece modifico la proprietà COLONNE (Oggetto), finchè la form rimane attiva, la proprietà viene mantenuta, se la chiudo e la riapro, perdo le modifiche apportate all'oggetto.

Se modifico prima la proprietà COLONNE e poi modifico anche la proprietà DISTANZA, allora memorizza in modo definitivo anche la proprietà oggetto.

Qualcuno mi può aiutare a capire perchè??

munissor Profilo | Senior Member

Il PropertyGrid internamente si collega all'evento <NomeProprietà>Changed per sapere quando la proprietà viene modificata per ricaricare il valore.
Prova a creare e generare l'evento per la tua proprietà per vedere se funziona...io ci avevo smadonnato parecchio dietro questa cosa sul framework 1.0 e con disasm avevo scoperto questa cosa. Non so poi se nelle versioni successive sia stato introdotto altro. Cerca in caso nella documentazione del PropertyGrid.


Ciao!

SSUPERPIPPO Profilo | Guru

Intanto grazie per l'aiuto...

> Prova a creare e generare l'evento per la tua proprietà per vedere se funziona...

Mi dai qualche aiuto su come generare l'evento per la mia proprietà?

Grazie 1000, ciao

Alessandro

munissor Profilo | Senior Member

Come da pratica standard:


private int myValue; public int Value { get{return myValue;} set { if( myValue != value ) { myValue = value; OnValueChanged(EventArgs.Empty); } } } public event EventHandler ValueChanged; protected virtual void OnValueChanged(EventArgs e) { if( ValueChanged != null ) ValueChanged(this, e); }

SSUPERPIPPO Profilo | Guru

Il controllo che ho realizzato è in VB.NET.
Ho provato con così:

' Il tipo <DatiColonne> corrisponde ad un oggetto che ho creato e che conterrà dei valori (proprietà) attraverso una form di input personalizzata

<Editor(GetType(EditorBridge), GetType(UITypeEditor))> _
Property Colonne() As DatiColonne

Get
Return DtDati
End Get

Set(ByVal value As DatiColonne)
DtDati = value
RaiseEvent ValueChanged(Me, EventArgs.Empty)
End Set

End Property


Public Event ValueChanged(ByVal sender As Object, ByVal e As EventArgs)

Private Sub OnValueChanged(ByVal sender As Object, ByVal e As EventArgs)

RaiseEvent ValueChanged(sender, e)

End Sub

' Purtroppo anche così, quando io modifico le proprietà dell'oggetto passato non succede niente e alla riapertura del form perdo le modifiche

Grazie per il tuo aiuto.

munissor Profilo | Senior Member

Ah! Perchè è una collection? Una proprietà collection va generalmente sempre in sola lettura (non modifichi mai l'oggetto collection, modifichi solo il contenuto) e applica l'attributo [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] per fare in modo che il designer scriva correttamente il codice. Così dovrebbe andare!

SSUPERPIPPO Profilo | Guru

HO COSI' MODIFICATO LA PROPERTY MA SENZA NESSUN ESITO POSITIVO. NON MI MEMORIZZA LE MODIFICHE APPORTATE AL CONTENUTO DELL'OGGETTO... :

<DesignerSerializationVisibility(DesignerSerializationVisibility.Content), _
System.ComponentModel.RefreshProperties(RefreshProperties.All), Editor(GetType(EditorBridge), GetType(UITypeEditor))> _
Property Colonne() As DatiColonne

Get
Return DtDati
End Get

Set(ByVal value As DatiColonne)
DtDati = value
RaiseEvent ValueChanged(Me, EventArgs.Empty)
End Set

End Property


SE PUO' ESSERTI UTILE LA CLASSE DELL'OGGETTO CHE PASSO COME PROPRIETA' E' LA SEGUENTE:

Imports System.ComponentModel
Imports System.ComponentModel.EditorAttribute
Imports System.Drawing.Design

Public Class DatiColonne

#Region "Dichiarazioni"

Dim IntNrColonne As Integer
Dim IntLarghezza(100) As Integer
Dim StrTitolo(100) As String
Dim BoolObbligatorio(100) As Boolean
Dim BoolVisibile(100) As Boolean
Dim BoolAbilitato(100) As Boolean
Dim BoolTabStop(100) As Boolean
Dim IntTpControllo(100) As Integer

#End Region

Sub New()

' Inizializza gli array stringa per evitare errori nel salvataggio
' delle proprietà

For IntCont As Integer = 0 To 100
StrTitolo(IntCont) = ""
Next

End Sub

#Region "Proprietà di classe"

Public Property NrColonne() As Integer
Get
Return IntNrColonne
End Get
Set(ByVal value As Integer)
IntNrColonne = value
End Set
End Property

Public Property Larghezza() As Integer()
Get
Return IntLarghezza
End Get
Set(ByVal value As Integer())
IntLarghezza = value
End Set
End Property

Public Property Titolo() As String()
Get
Return StrTitolo
End Get
Set(ByVal value As String())
StrTitolo = value
End Set
End Property

Public Property Obbligatorio() As Boolean()
Get
Return BoolObbligatorio
End Get
Set(ByVal value As Boolean())
BoolObbligatorio = value
End Set
End Property

Public Property Visibile() As Boolean()
Get
Return BoolVisibile
End Get
Set(ByVal value As Boolean())
BoolVisibile = value
End Set
End Property

Public Property Abilitato() As Boolean()
Get
Return BoolAbilitato
End Get
Set(ByVal value As Boolean())
BoolAbilitato = value
End Set
End Property

Public Property TabStop() As Boolean()
Get
Return BoolTabStop
End Get
Set(ByVal value As Boolean())
BoolTabStop = value
End Set
End Property

Public Property TpControllo() As Integer()
Get
Return IntTpControllo
End Get
Set(ByVal value As Integer())
IntTpControllo = value
End Set
End Property

#End Region

End Class


COSA DICI? HAI IDEA DI COS'ALTRO POSSO PROVARE?

GRAZIE PER LA TUA DISPONIBILITA'

CIAO

munissor Profilo | Senior Member

Boh..sto finendo le idee..

In teoria però non dovresti modificare la collection, quindi dovresti togliere il metodo Set dalla prorprietà (ovviamente la classe deve istanziare da sola il campo sul costruttore..)

Prova così..
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