none
Klasse mit List(of String()) in Datagridview anzeigen RRS feed

  • Frage

  • Hallo Experten

    Innerhalb einer Klasse habe ich

    Dim Anhang as new List(of String())

    über eine Klassen-Funktion kann ich der Liste Element hinzufügen

        PublicSubMailAnhaenge_Add(ByValName AsString, ByValBetreff AsString, ByValPfad AsString, ByValdateiName AsString, ByValtyp AsString)

        Anhang.Add({Name, Betreff, Pfad, dateiName, typ})

        END SUB

    Nun möchte ich einer Form, welche die Klasse benutzt, ein DGV an diese Liste (nicht an die Klasse) binden, wie geht das ???

    vielen dank für eure Hilfe ... mfg eem monarch

    Donnerstag, 28. Juni 2012 12:50

Antworten

  • Servus Elmar,

    wie immer hast du recht ... hab es jetzt wie folgt gemacht ... funzt und ist auch die saubere Lösung.

    '
    'Form
    '
    Public Class DocMail
        Dim clMail As Mail 'Klasse
     Private Sub DocMail_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '...
    
            'dgvAnlagen binden
            dgvMailAnlagen.DataSource = clMail.MailAnhang
        End Sub
    end class
    
    '
    'Klasse Mail + MailAnhang
    '
    Imports System.ComponentModel
    Public Class Mail
    
        Public MailAnhang As New List(Of MailAnhang)
    
        Public Sub MailAnhaenge_Add(ByVal Name As String, ByVal Betreff As String, ByVal Pfad As String, ByVal dateiName As String, ByVal typ As String)
           MailAnhang.Add(New MailAnhang(Name, Betreff, Pfad, dateiName, typ))
        End Sub
    
    end class
    Public Class MailAnhang
        Dim _Name As String
        Dim _Betreff As String
        Dim _Pfad As String
        Dim _DateiName As String
        Dim _Typ As String
    
        Public Sub New(ByVal Name As String, ByVal Betreff As String, ByVal Pfad As String, ByVal dateiName As String, ByVal typ As String)
            _Name = Name
            _Betreff = Betreff
            _Pfad = Pfad
            _DateiName = dateiName
            _Typ = typ
        End Sub
        Public Property typ As String
            Get
                Return _Typ
            End Get
            Set(ByVal value As String)
                _Typ = value
            End Set
        End Property
        Public Property dateiName As String
            Get
                Return _DateiName
            End Get
            Set(ByVal value As String)
                _DateiName = value
            End Set
        End Property
        Public Property Pfad As String
            Get
                Return _Pfad
            End Get
            Set(ByVal value As String)
                _Pfad = value
            End Set
        End Property
        Public Property Betreff As String
            Get
                Return _Betreff
            End Get
            Set(ByVal value As String)
                _Betreff = value
            End Set
        End Property
        Public Property Name As String
            Get
                Return _Name
            End Get
            Set(ByVal value As String)
                _Name = value
            End Set
        End Property
    End Class
    
    

    Donnerstag, 28. Juni 2012 14:56

Alle Antworten

  • Hallo Experten,

    habe jetzt ma probiert, das ganze ohne Klasse zu machen, hat aber leider auch nicht funktioniert

    Imports System.IO Imports System.ComponentModel Public Class DocMail Dim Listtest As New BindingList(Of String()) Private Sub DocMail_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ... 'dgvAnlagen binden Listtest.Add({"A1", "A2"})

    Listtest.Add({"AB1", "AB2"})

    dgvMailAnlagen.DataSource = Listtest ... end sub

    Im DGV stehen zwar Werte (Length, LongLength,Rank,SyncRoot, etc) drin, aber ich hätte gerne in Zeile1 A1,A2 und in Zeile2 "AB1","AB2" jemand eine Idee?

    danke mfg eem Monarch

    Donnerstag, 28. Juni 2012 13:39
  • Hallo,

    mit einer List(Of String()) funktioniert die Datenbindung nicht -
    bzw. nur wenn man den virtuellen Modus (keine Bindung) nutzen würde.

    Die Datenbindung braucht nun mal Eigenschaften, hier um die DataProperty zu ermitteln,
    die in den einzelnen Spalten angezeigt werden sollen. Deswegen klappen Arrays nicht.

    Da Du oben eine Add-Methode mit konkreten Namen verwendest,
    solltest Du den nächsten Schritt tun, und eine Klasse daraus machen.

    Dann noch eine BindingList(Of T) in Verbindung mit der INotifyPropertyChanged Schnittstelle
    für die Eigenschaften und die Datenbindung funktioniert richtig.

    Gruß Elmar

    Donnerstag, 28. Juni 2012 14:26
    Beantworter
  • Servus Elmar,

    wie immer hast du recht ... hab es jetzt wie folgt gemacht ... funzt und ist auch die saubere Lösung.

    '
    'Form
    '
    Public Class DocMail
        Dim clMail As Mail 'Klasse
     Private Sub DocMail_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    '...
    
            'dgvAnlagen binden
            dgvMailAnlagen.DataSource = clMail.MailAnhang
        End Sub
    end class
    
    '
    'Klasse Mail + MailAnhang
    '
    Imports System.ComponentModel
    Public Class Mail
    
        Public MailAnhang As New List(Of MailAnhang)
    
        Public Sub MailAnhaenge_Add(ByVal Name As String, ByVal Betreff As String, ByVal Pfad As String, ByVal dateiName As String, ByVal typ As String)
           MailAnhang.Add(New MailAnhang(Name, Betreff, Pfad, dateiName, typ))
        End Sub
    
    end class
    Public Class MailAnhang
        Dim _Name As String
        Dim _Betreff As String
        Dim _Pfad As String
        Dim _DateiName As String
        Dim _Typ As String
    
        Public Sub New(ByVal Name As String, ByVal Betreff As String, ByVal Pfad As String, ByVal dateiName As String, ByVal typ As String)
            _Name = Name
            _Betreff = Betreff
            _Pfad = Pfad
            _DateiName = dateiName
            _Typ = typ
        End Sub
        Public Property typ As String
            Get
                Return _Typ
            End Get
            Set(ByVal value As String)
                _Typ = value
            End Set
        End Property
        Public Property dateiName As String
            Get
                Return _DateiName
            End Get
            Set(ByVal value As String)
                _DateiName = value
            End Set
        End Property
        Public Property Pfad As String
            Get
                Return _Pfad
            End Get
            Set(ByVal value As String)
                _Pfad = value
            End Set
        End Property
        Public Property Betreff As String
            Get
                Return _Betreff
            End Get
            Set(ByVal value As String)
                _Betreff = value
            End Set
        End Property
        Public Property Name As String
            Get
                Return _Name
            End Get
            Set(ByVal value As String)
                _Name = value
            End Set
        End Property
    End Class
    
    

    Donnerstag, 28. Juni 2012 14:56
  • Hallo,

    verpasse Deiner Klasse noch ein INotifyPropertyChanged wie oben vorgeschlagen,
    exemplarisch für eine Eigenschaft - Rest äquivalent:

    Public Class MailAnhang
        Implements System.ComponentModel.INotifyPropertyChanged
    
    
        Public Event PropertyChanged(sender As Object, e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    
        Protected Overridable Sub OnPropertyChanged(propertyName As String)
            RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs(propertyName))
        End Sub
    
        Private _typ As String
    
        Public Property Typ As String
            Get
                Return _Typ
            End Get
            Set(ByVal value As String)
                If _typ != value then
    
                    _Typ = value
                    OnPropertyChanged("Typ")
                End If
            End Set
        End Property
    End Class
    

    Dann kannst Du eine BindingList einsetzen und das DataGridView bekommt Änderungen mit.

    Gruß Elmar

    Donnerstag, 28. Juni 2012 16:09
    Beantworter