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

Custom DataBinding

  1. #1
    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.[COLOR=#2b91af]EventArgs) Handles Me.Load
    nudHour.DataBindings.Add(New [COLOR=#2b91af]Binding("Value", oMyTime, "Hour"))
    AddHandler nudHour.ValueChanged, AddressOf NumericUpDown_ValueChanged

    nudMinute.DataBindings.Add(New [COLOR=#2b91af]Binding("Value", oMyTime, "Minute"))
    AddHandler nudMinute.ValueChanged, AddressOf NumericUpDown_ValueChanged

    nudSecond.DataBindings.Add(New [COLOR=#2b91af]Binding("Value", oMyTime, "Second"))
    AddHandler nudSecond.ValueChanged, AddressOf NumericUpDown_ValueChanged

    nudMillisecond.DataBindings.Add(New [COLOR=#2b91af]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 Fix; 08-03-2021 15:30  Motivo: Corretta la visualizzazione codice
    ℹ️ 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