+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 1 su 1

Custom DataBinding

  1. #1
    Post
    2,278
    Blogs
    6
    Like Inviati  
    6
    Like Ricevuti  
    3
    Custom DataBinding



    Livello: Avanzato


    Introduzione:

    In questo articolo vedremo come sia possibile creare un’associazione dati personalizzata, che ci permetta di associare le proprietÓ di una nostra Classe, alle proprietÓ dei controlli.

    L’esempio che seguirÓ Ŕ stato ispirato dalla seguente discussione: http://forum.masterdrive.it/visual-b...cupdown-50310/

    Per il funzionamento dell’esempio sono necessari i seguenti Controlli:


    4 – Controlli NumericUpDown, denominati:
    • nudHour (impostare la proprietÓ Minimum a -1)
    • nudMinute (impostare la proprietÓ Minimum a -1)
    • nudSecond (impostare la proprietÓ Minimum a -1)
    • nudMillisecond (impostare la proprietÓ Minimum a -1 e la proprietÓ Maximum a 1000)
    1 – Controllo Button, denominato:
    • btnShow
    Funzionamento:



    L’associazione dati avviene tramite l’aggiunta di un oggetto “Binding” alle ProprietÓ “DataBindings” che espongono i controlli. Nel caso specifico, Ŕ stato necessario implementare l’interfaccia INotifyPropertyChanged per permettere alla “Classe Custom” di notificare “immediatamente” le modifiche delle proprietÓ, in modo che i controlli associati potessero modificare, a loro volta, il valore della proprietÓ associata. Le notifiche sono generate tramite l’Evento PropertyChanged , a cui viene passato l’oggetto PropertyChangedEventArgs contenente il nome della proprietÓ modificata.


    Classe Custom

    Vediamo la Classe Custom, denominata cMyTime

    Public Class cMyTime
     Implements System.ComponentModel.INotifyPropertyChanged
      '-- Evento da generare per Notificare immediatamente la modifica della proprietÓ
      Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
     '-- variabili private
     Private pHour As Integer
     Private pMinute As Integer
     Private pSecond As Integer
     Private pMillisecond As Integer
     
     '-- Ore
     Public Property Hour As Integer
     Get
     Return pHour
     End Get
     Set(ByVal value As Integer)
              pHour = value
     If value > 23 Then
                  pHour = 0
     ElseIf value < 0 Then
                  pHour = 23
     End If
          '-- notifico immediatamente il cambio della proprietÓ
          RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Hour"))
     End Set
     End Property
     
     '-- Minuti
     Public Property Minute As Integer
     Get
     Return pMinute
     End Get
     Set(ByVal value As Integer)
              pMinute = value
     If value < 0 Then
                  pMinute = 59
                  Hour -= 1
     ElseIf value > 59 Then
                  pMinute = 0
                  Hour += 1
     End If
     '-- notifico immediatamente il cambio della proprietÓ
              RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Minute"))
     End Set
     End Property
     
     '-- secondi
     Public Property Second As Integer
     Get
              Return pSecond
     End Get
     Set(ByVal value As Integer)
              pSecond = value
     If value < 0 Then
                  pSecond = 59
                  Minute -= 1
     ElseIf value > 59 Then
                  pSecond = 0
                  Minute += 1
     End If
     '-- notifico immediatamente il cambio della proprietÓ
              RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Second"))
     End Set
     End Property
     
     '-- Millisecondi
     Public Property Millisecond As Integer
     Get
     Return pMillisecond
     End Get
     Set(ByVal value As Integer)
              pMillisecond = value
     If value < 0 Then
                  pMillisecond = 999
                  Second -= 1
     ElseIf value > 999 Then
                  pMillisecond = 0
                  Second += 1
     End If
     '-- notifico immediatamente il cambio della proprietÓ
              RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("Millisecond"))
          End Set
     End Property
     
     '-- Ritorna il tempo nel formato voluto
      Public Overrides Function ToString() As String
     Dim ts As New TimeSpan(0, Hour, Minute, Second, Millisecond)
     Return New Date(ts.Ticks).ToString("HH:mm:ss.fff")
      End Function
     
    End Class
    

    FORM1:


    Lato FORM, dobbiamo creare un nuovo Oggetto cMyTime, lo chiameremo oMyTime
    Private oMyTime As New cMyTime
    
    Nel Form Load inseriremo il codice per associare i dati, ed “agganceremo” gli eventi, di tutti e 4 i controlli NumericUpDown, alla stessa Sub.


     Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
          nudHour.DataBindings.Add(New Binding("Value", oMyTime, "Hour"))
     AddHandler nudHour.ValueChanged, AddressOf NumericUpDown_ValueChanged
     
          nudMinute.DataBindings.Add(New Binding("Value", oMyTime, "Minute"))
     AddHandler nudMinute.ValueChanged, AddressOf NumericUpDown_ValueChanged
     
          nudSecond.DataBindings.Add(New Binding("Value", oMyTime, "Second"))
     AddHandler nudSecond.ValueChanged, AddressOf NumericUpDown_ValueChanged
     
          nudMillisecond.DataBindings.Add(New Binding("Value", oMyTime, "Millisecond"))
     AddHandler nudMillisecond.ValueChanged, AddressOf NumericUpDown_ValueChanged
     
    End Sub
    
    Questa Ŕ la Sub che gestirÓ gli eventi:

     Private Sub NumericUpDown_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
     Dim NUD As NumericUpDown = DirectCast(sender, NumericUpDown)
          '-- verifico quale controllo ha generato l'evento
     Select Case NUD.Name
     '-- modificando le proprietÓ del nostro oggetto
     '-- verranno modificati in automatico tutti i valori dei NumericUpDown
              Case "nudHour"
                  oMyTime.Hour = NUD.Value
     
     Case "nudMinute"
                  oMyTime.Minute = NUD.Value
     
     Case "nudSecond"
                  oMyTime.Second = NUD.Value
     
     Case "nudMillisecond"
                  oMyTime.Millisecond = NUD.Value
     
           End Select
     
     End Sub
    
    e questo il codice dell'evento Click del Button:

     Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
     MessageBox.Show(oMyTime.ToString)
     End Sub
    
    BasterÓ modificare il valore dei NumericUpDown, per vedere cambiare tutti gli altri associati, senza la necessitÓ di gestire la loro modifica individualmente.
    Premendo il Button si potrÓ visualizzare il Tempo in una MessageBox.

    Alla prossima

    Ultima modifica di elisab; 06-01-2011 21:50  Motivo: su richiesta dell'utente
    ℹ️ Leggi di pi¨ su Fix ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. databinding con gridview
    Da Fapic nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 24-02-2010, 13:45
  2. DataBinding Aiuto
    Da rstlg@email.it nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 24-06-2009, 12:47
  3. [vb.net 2005] databinding e varie
    Da papy2 nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 31-07-2008, 14:27
  4. DataBinding
    Da cippalippa nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 17-03-2008, 02:10
  5. Databinding a numeri
    Da cippalippa nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 23-06-2007, 09:37