none
Datagridview Zellen vergleichen und markieren RRS feed

  • Frage

  • Guten Tag,

     

    ich habe in meinem DGV die Spalten Datum und Raum. Nun möchte ich die Zeilen mit gleichen Datum un Raum vergleichen und wenn sie mehrfach vorhanden sind einfärben. Ich habe es jetzt soweit, dass ich die Spalte Raum nach einem bestimmten Raum durchsuche und wenn diesre vorhanden ist wird diese Zelle eingefärbt.

     

     Sub dataGridView1_CellFormatting(ByVal sender As Object, _<br/>
      ByVal e As DataGridViewCellFormattingEventArgs) _<br/>
      Handles DataGridView1.CellFormatting<br/>
    <br/>
        If e.ColumnIndex = Me.DataGridView1.Columns("Raum").Index _<br/>
          AndAlso Not (e.Value Is Nothing) Then<br/>
    <br/>
          With Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex)<br/>
    <br/>
            If e.Value.Equals("Saal") Then<br/>
              e.CellStyle.BackColor = Color.Red<br/>
              e.CellStyle.SelectionBackColor = Color.DarkRed<br/>
            End If<br/>
    <br/>
          End With<br/>
    <br/>
        End If<br/>
    <br/>
      End Sub 
    

     

    wie kann ich aber jetzt noch das Datum zuweisen und dann vergleichen.

    BSP:

    21.10.2010 - Saal
    22.10.2010 - Saal
    22.10.2010 - Saal
    22.10.2010 - Schuppen

    die mittleren beiden zeilen sollen jetzt farbig hervorgehoben werden.

     

    Danke

    Dienstag, 3. August 2010 11:51

Antworten

  • Hallo,

    ich habe in meinem DGV die Spalten Datum und Raum.
    Nun möchte ich die Zeilen mit gleichen Datum un Raum
    vergleichen und wenn sie mehrfach vorhanden sind einfärben.
    Ich habe es jetzt soweit, dass ich die Spalte Raum nach
    einem bestimmten Raum durchsuche und wenn diesre
    vorhanden ist wird diese Zelle eingefärbt.

    Kopiere das nachfolgende Beispiel in ein leeres Formmodul (Form1.vb)

     ' / Beginn Code Form1.vb
    Public Class Form1
        Private WithEvents DGV As DataGridView
        Private WithEvents btnNew As Button
        Private mDT As DataTable
        Private mDV As DataView

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                 ) Handles MyBase.Load

            CreateData()

            CreateControls()

            With DGV
                .DataSource = mDV
                .Columns(0).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleLeft

                .Columns(1).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleCenter
            End With

            FindDuplicates()
        End Sub

        Private Sub CreateControls()
            btnNew = New Button
            With btnNew
                .Name = "btnNew"
                .Font = New Font("Arial", 10)
                .Text = "New Data"

                .SetBounds _
                        (Me.ClientSize.Width - 120, _
                         Me.ClientSize.Height - 50, _
                         90, 40)

                .Anchor = _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnNew)

            DGV = New DataGridView
            With DGV
                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         btnNew.Top - 20)

                .DefaultCellStyle.Font = _
                        New Font("Arial", 12)

                .ColumnHeadersDefaultCellStyle.Font = _
                        New Font("Arial", 8, FontStyle.Bold)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(DGV)
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim RNum As Integer
            Dim DR As DataRow
            Dim Rnd As New Random(Now.Millisecond)

            Dim Raum() As String = _
                    New String() _
                    {"Saal1", "Saal2", "Saal3", "Schuppen", "Keller1", "Keller2"}

            mDT = New DataTable
            With mDT
                .Columns.Add("Raum", GetType(String))
                .Columns.Add("Datum", GetType(Date))

                For i = 1 To 25
                    DR = .NewRow
                    RNum = Rnd.Next(1, 6)
                    DR.Item(0) = Raum(RNum)

                    DR.Item(1) = _
                            Date.Today.AddDays(Rnd.Next(0, 15))

                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mDV = New DataView(mDT)
            mDV.AllowNew = False
            mDV.Sort = "Raum, Datum ASC"
        End Sub

        Private Sub DGV_DataSourceChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles DGV.DataSourceChanged

            DGV.AutoResizeColumns()
        End Sub

        Private Sub btnNew_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                 ) Handles btnNew.Click

            DGV.DataSource = Nothing
            CreateData()
            DGV.DataSource = mDV

            FindDuplicates()
        End Sub

        Private Sub FindDuplicates()
            Dim i As Integer
            Dim DRV As DataRowView
            Dim DRVnext As DataRowView
            For i = 0 To mDV.Count - 2
                DRV = mDV(i)
                DRVnext = mDV(i + 1)

                If DRV.Item(0).Equals(DRVnext(0)) Then
                    If DRV.Item(1).Equals(DRVnext(1)) Then

                        DGV.Rows(i).DefaultCellStyle.BackColor = _
                                Color.Red

                        DGV.Rows(i + 1).DefaultCellStyle.BackColor = _
                                Color.Red
                    End If
                End If
            Next
        End Sub

        Private Sub Form1_Shown _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Shown

            Dim R As Rectangle = _
                    Screen.GetWorkingArea(Me)

            Me.SetBounds _
                    (R.Left + 60, _
                     R.Top + CInt(R.Height * 0.1), _
                     300, _
                     CInt(R.Height * 0.8))
        End Sub
    End Class
    ' \\\ E N T E

    Nach dem Programmstart siehst Du eine Form1 mit einem DataGridview
    in dem Zeilen mit 5 verschiedenen Räumen und einem zugehörigen Datum
    sichtbar sind. Doppelbelegungen sind rot hinterlegt.
    Mit dem Button "New Data" können neue Daten erzeugt werden.

    Mehr Beispiele zum DataGridView unter
        www.gssg.de -> Visual Basic -> VB.net

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 3. August 2010 19:44
  • Hallo Johannes,

    ich habe mal versucht Deinen Code aus beiden Beiträgen und den von Peter zu integrieren.
    Ich habe etwas andere Benennungen verwendet und verwende symbolische Namen
    anstatt Indizes, um das falschen Zuordnungen vorzubeugen.

    Da Du oben sowohl Saal und Raum später aber von Datum schreibst,
    bin ich mir allerdings nicht sicher ob Du nun drei oder zwei Spalten verwendest.
    Seis drum: Ich habe es zunächst auf drei Spalten ausgelegt, wenn das eine zuviel ist,
    kannst Du sie wieder rauswerfen.

    Um das Laden zu simulieren fülle ich unten den die DataTable wie Peter manuell.
    Funktioniert das so wie gewollt, kannst Du Dein Fill reaktivieren.

    Beachte dass die Sortierung, wie im FindDuplicates gezeigt, gesetzt sein muß,
    sonst klappt das mit den Vergleichen und der Zuordnung im DataGridView nicht.

    Public Class VeranstaltungForm
      ' Spaltennamen in der Tabelle
      Private Const VeranstaltungTableName = "Veranstaltungen"
      Private Const DatumColumnName As String = "Datum"
      Private Const SaalColumnName As String = "Saal"
      Private Const RaumColumnName As String = "Raum"
    
      Public Sub New()
        InitializeComponent()
      End Sub
    
      Private Sub VeranstaltungForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Me.VeranstaltungenTableAdapter.Fill(Me.VeranstaltungenDataSet.Veranstaltungen)
        Fill()
    
        Me.DataGridView1.AutoGenerateColumns = True
        Me.DataGridView1.DataSource = Me.VeranstaltungenBindingSource
        'Me.DataGridView1.Columns("Id").Visible = True
        Me.DataGridView1.ReadOnly = True
        Me.DataGridView1.AllowUserToAddRows = False
        Me.DataGridView1.AutoResizeColumns()
        Me.DataGridView1.AutoResizeRows()
    
        FindDuplicates()
      End Sub
    
      Private Sub FindDuplicates()
        ' Die Sortierung ist entscheidend (kann bereits im Designer gesetzt werden)
        Me.VeranstaltungenBindingSource.Sort = "Raum, Saal, Datum"
        Dim view As DataView = DirectCast(VeranstaltungenBindingSource.List, DataView)
    
        For rowindex As Integer = 0 To view.Count - 2
          ' Aktuelle und Folgezeile
          Dim rowView = view(rowindex)
          Dim nextRowView = view(rowindex + 1)
    
          ' Im gleichen Raum und Saal am gleichen Datum
          If rowView(RaumColumnName).Equals(nextRowView(RaumColumnName)) _
            AndAlso rowView(SaalColumnName).Equals(nextRowView(SaalColumnName)) _
            AndAlso rowView(DatumColumnName).Equals(nextRowView(DatumColumnName)) Then
            Me.DataGridView1.Rows(rowindex).DefaultCellStyle.BackColor = Color.Red
            Me.DataGridView1.Rows(rowindex + 1).DefaultCellStyle.BackColor = Color.Red
          End If
        Next
      End Sub
    
    #Region "Datenanlage"
      ''' <summary>Simuliert das Laden der DataTable</summary>
      Private Sub Fill()
        ' Hier Tabelle (im Designer) mit ID, Datum, Raum, Saal
        Dim table = Me.VeranstaltungenDataSet.Tables(VeranstaltungTableName)
        AddRow(table, New Date(2010, 10, 21), "Raum 1", "Saal")
        AddRow(table, New Date(2010, 10, 22), "Raum 1", "Saal")
        AddRow(table, New Date(2010, 10, 22), "Raum 1", "Saal")
        AddRow(table, New Date(2010, 10, 22), "Raum 1", "Schuppen")
        table.AcceptChanges()
      End Sub
    
      ''' <summary>Legt eine Zeile an</summary>
      Private Sub AddRow(ByVal table As DataTable, ByVal datum As Date, ByVal raum As String, ByVal saal As String)
        Dim row = table.NewRow()
        row(DatumColumnName) = datum
        row(RaumColumnName) = raum
        row(SaalColumnName) = saal
        table.Rows.Add(row)
      End Sub
    #End Region
    
    End Class
    
    
    

    Gruß Elmar

     

    Mittwoch, 4. August 2010 08:28
    Beantworter

Alle Antworten

  • Hallo,

    ich habe in meinem DGV die Spalten Datum und Raum.
    Nun möchte ich die Zeilen mit gleichen Datum un Raum
    vergleichen und wenn sie mehrfach vorhanden sind einfärben.
    Ich habe es jetzt soweit, dass ich die Spalte Raum nach
    einem bestimmten Raum durchsuche und wenn diesre
    vorhanden ist wird diese Zelle eingefärbt.

    Kopiere das nachfolgende Beispiel in ein leeres Formmodul (Form1.vb)

     ' / Beginn Code Form1.vb
    Public Class Form1
        Private WithEvents DGV As DataGridView
        Private WithEvents btnNew As Button
        Private mDT As DataTable
        Private mDV As DataView

        Private Sub Form1_Load _
                (ByVal sender As System.Object, _
                 ByVal e As System.EventArgs _
                 ) Handles MyBase.Load

            CreateData()

            CreateControls()

            With DGV
                .DataSource = mDV
                .Columns(0).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleLeft

                .Columns(1).DefaultCellStyle.Alignment = _
                        DataGridViewContentAlignment.MiddleCenter
            End With

            FindDuplicates()
        End Sub

        Private Sub CreateControls()
            btnNew = New Button
            With btnNew
                .Name = "btnNew"
                .Font = New Font("Arial", 10)
                .Text = "New Data"

                .SetBounds _
                        (Me.ClientSize.Width - 120, _
                         Me.ClientSize.Height - 50, _
                         90, 40)

                .Anchor = _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnNew)

            DGV = New DataGridView
            With DGV
                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         btnNew.Top - 20)

                .DefaultCellStyle.Font = _
                        New Font("Arial", 12)

                .ColumnHeadersDefaultCellStyle.Font = _
                        New Font("Arial", 8, FontStyle.Bold)

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Top Or _
                        AnchorStyles.Right Or _
                        AnchorStyles.Bottom

            End With
            Me.Controls.Add(DGV)
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim RNum As Integer
            Dim DR As DataRow
            Dim Rnd As New Random(Now.Millisecond)

            Dim Raum() As String = _
                    New String() _
                    {"Saal1", "Saal2", "Saal3", "Schuppen", "Keller1", "Keller2"}

            mDT = New DataTable
            With mDT
                .Columns.Add("Raum", GetType(String))
                .Columns.Add("Datum", GetType(Date))

                For i = 1 To 25
                    DR = .NewRow
                    RNum = Rnd.Next(1, 6)
                    DR.Item(0) = Raum(RNum)

                    DR.Item(1) = _
                            Date.Today.AddDays(Rnd.Next(0, 15))

                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mDV = New DataView(mDT)
            mDV.AllowNew = False
            mDV.Sort = "Raum, Datum ASC"
        End Sub

        Private Sub DGV_DataSourceChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles DGV.DataSourceChanged

            DGV.AutoResizeColumns()
        End Sub

        Private Sub btnNew_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                 ) Handles btnNew.Click

            DGV.DataSource = Nothing
            CreateData()
            DGV.DataSource = mDV

            FindDuplicates()
        End Sub

        Private Sub FindDuplicates()
            Dim i As Integer
            Dim DRV As DataRowView
            Dim DRVnext As DataRowView
            For i = 0 To mDV.Count - 2
                DRV = mDV(i)
                DRVnext = mDV(i + 1)

                If DRV.Item(0).Equals(DRVnext(0)) Then
                    If DRV.Item(1).Equals(DRVnext(1)) Then

                        DGV.Rows(i).DefaultCellStyle.BackColor = _
                                Color.Red

                        DGV.Rows(i + 1).DefaultCellStyle.BackColor = _
                                Color.Red
                    End If
                End If
            Next
        End Sub

        Private Sub Form1_Shown _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles Me.Shown

            Dim R As Rectangle = _
                    Screen.GetWorkingArea(Me)

            Me.SetBounds _
                    (R.Left + 60, _
                     R.Top + CInt(R.Height * 0.1), _
                     300, _
                     CInt(R.Height * 0.8))
        End Sub
    End Class
    ' \\\ E N T E

    Nach dem Programmstart siehst Du eine Form1 mit einem DataGridview
    in dem Zeilen mit 5 verschiedenen Räumen und einem zugehörigen Datum
    sichtbar sind. Doppelbelegungen sind rot hinterlegt.
    Mit dem Button "New Data" können neue Daten erzeugt werden.

    Mehr Beispiele zum DataGridView unter
        www.gssg.de -> Visual Basic -> VB.net

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Dienstag, 3. August 2010 19:44
  • Hallo Peter,

     

    danke für dein Beispiel. Ich habe das jetzt versucht auf mein Problem anzupassen.

    Meine Frage jetzt. Du machst mit mDT eine Neue DataTable welche DU mit Daten (Raum, Datum) füllst.
    Darauf machst DU dann den mDV. Ich selber brauch ja aber keine neue Datatable weil ich doch die Daten schon habe, ist das richtig?
    wie kann ich denn den mDV auf meine Datenbank, (DataSet oder DataGridView????) machen.

     

    Danke, Johannes
    Mittwoch, 4. August 2010 06:13
  • Hallo Johannes,

    nein, Du brauchst keine neue DataTable.
    Damit Peters Beispiel lauffähig wurde, mußte er sich aber eine erzeugen.

    Du solltest mDT durch Deine DataTable ersetzen - die wir wiederum nicht kennen.
    Gemeint ist die, an die Du Dein DataGridView gebunden hast.

    Verwendest Du eine BindingSource, so kannst Du BindingSource.List verwenden:

    Dim mDV As DataView = DirectCast(gridBindingSource.List, DataView)

    Gruß Elmar

    Mittwoch, 4. August 2010 07:29
    Beantworter
  • Danke Elmar.

     

    Ja ich verwende eine BindingSource welche im Form1_Load dem DataGridView zugewiesen wird

     

    Me.DataGridView1.DataSource = Me.VeranstaltungenBindingSource
    

     

    Habe deinen Vorschlag jetzt in FindDuplicates() eingebaut

     

    Private Sub FindDuplicates()
    
        Dim i As Integer
        Dim mDV As DataView = DirectCast(VeranstaltungenBindingSource.List, DataView)
        Dim DRV As DataRowView
        Dim DRVnext As DataRowView
        For i = 0 To mDV.Count - 2
          DRV = mDV(i)
          DRVnext = mDV(i + 1)
    
    
          If DRV.Item(1).Equals(DRVnext(1)) Then
            If DRV.Item(4).Equals(DRVnext(4)) Then
    
              DataGridView1.Rows(i).DefaultCellStyle.BackColor = _
                  Color.Red
    
              DataGridView1.Rows(i + 1).DefaultCellStyle.BackColor = _
                  Color.Red
            End If
          End If
        Next
      End Sub
    

    DRV.Iten(1) ist die Spalte Datum

    DRV.Item(4) ist die Spalte Raum

     

    Leider werden die doppelten Einträge nicht markiert.

    Public Class Form1
    
      Private mDV As DataView
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: Diese Codezeile lädt Daten in die Tabelle "VeranstaltungenDataSet.Veranstaltungen". Sie können sie bei Bedarf verschieben oder entfernen.
        Me.VeranstaltungenTableAdapter.Fill(Me.VeranstaltungenDataSet.Veranstaltungen)
        Me.DataGridView1.AutoGenerateColumns = True
        Me.DataGridView1.DataSource = Me.VeranstaltungenBindingSource
        Me.DataGridView1.Columns("Id").Visible = True
        Me.DataGridView1.ReadOnly = True
        Me.DataGridView1.AllowUserToAddRows = False
        Me.DataGridView1.AutoResizeColumns()
        Me.DataGridView1.AutoResizeRows()
    
        FindDuplicates()
    
        'Via AddBoldedDate(DateTime date) wird nicht direkt aktualisiert
        Me.MonthCalendar1.BoldedDates = GetAllDates()
        AddHandler Me.MonthCalendar1.DateSelected, AddressOf Me.monthCalendar1_DateSelected
    
        
      End Sub
    
      'Doppelte Einträge Suchen
      Private Sub FindDuplicates()
    
        Dim i As Integer
        Dim mDV As DataView = DirectCast(VeranstaltungenBindingSource.List, DataView)
        Dim DRV As DataRowView
        Dim DRVnext As DataRowView
        For i = 0 To mDV.Count - 2
          DRV = mDV(i)
          DRVnext = mDV(i + 1)
    
    
          If DRV.Item(1).Equals(DRVnext(1)) Then
            If DRV.Item(4).Equals(DRVnext(4)) Then
    
              DataGridView1.Rows(i).DefaultCellStyle.BackColor = _
                  Color.Red
    
              DataGridView1.Rows(i + 1).DefaultCellStyle.BackColor = _
                  Color.Red
            End If
          End If
        Next
      End Sub
    End Class
    

    Habe ich noch irgendwas vergessen oder habe ich deinen Beitrag falsch verstanden.

     

    Danke, Johannes

     

     

    Mittwoch, 4. August 2010 07:45
  • Hallo Johannes,

    ich habe mal versucht Deinen Code aus beiden Beiträgen und den von Peter zu integrieren.
    Ich habe etwas andere Benennungen verwendet und verwende symbolische Namen
    anstatt Indizes, um das falschen Zuordnungen vorzubeugen.

    Da Du oben sowohl Saal und Raum später aber von Datum schreibst,
    bin ich mir allerdings nicht sicher ob Du nun drei oder zwei Spalten verwendest.
    Seis drum: Ich habe es zunächst auf drei Spalten ausgelegt, wenn das eine zuviel ist,
    kannst Du sie wieder rauswerfen.

    Um das Laden zu simulieren fülle ich unten den die DataTable wie Peter manuell.
    Funktioniert das so wie gewollt, kannst Du Dein Fill reaktivieren.

    Beachte dass die Sortierung, wie im FindDuplicates gezeigt, gesetzt sein muß,
    sonst klappt das mit den Vergleichen und der Zuordnung im DataGridView nicht.

    Public Class VeranstaltungForm
      ' Spaltennamen in der Tabelle
      Private Const VeranstaltungTableName = "Veranstaltungen"
      Private Const DatumColumnName As String = "Datum"
      Private Const SaalColumnName As String = "Saal"
      Private Const RaumColumnName As String = "Raum"
    
      Public Sub New()
        InitializeComponent()
      End Sub
    
      Private Sub VeranstaltungForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Me.VeranstaltungenTableAdapter.Fill(Me.VeranstaltungenDataSet.Veranstaltungen)
        Fill()
    
        Me.DataGridView1.AutoGenerateColumns = True
        Me.DataGridView1.DataSource = Me.VeranstaltungenBindingSource
        'Me.DataGridView1.Columns("Id").Visible = True
        Me.DataGridView1.ReadOnly = True
        Me.DataGridView1.AllowUserToAddRows = False
        Me.DataGridView1.AutoResizeColumns()
        Me.DataGridView1.AutoResizeRows()
    
        FindDuplicates()
      End Sub
    
      Private Sub FindDuplicates()
        ' Die Sortierung ist entscheidend (kann bereits im Designer gesetzt werden)
        Me.VeranstaltungenBindingSource.Sort = "Raum, Saal, Datum"
        Dim view As DataView = DirectCast(VeranstaltungenBindingSource.List, DataView)
    
        For rowindex As Integer = 0 To view.Count - 2
          ' Aktuelle und Folgezeile
          Dim rowView = view(rowindex)
          Dim nextRowView = view(rowindex + 1)
    
          ' Im gleichen Raum und Saal am gleichen Datum
          If rowView(RaumColumnName).Equals(nextRowView(RaumColumnName)) _
            AndAlso rowView(SaalColumnName).Equals(nextRowView(SaalColumnName)) _
            AndAlso rowView(DatumColumnName).Equals(nextRowView(DatumColumnName)) Then
            Me.DataGridView1.Rows(rowindex).DefaultCellStyle.BackColor = Color.Red
            Me.DataGridView1.Rows(rowindex + 1).DefaultCellStyle.BackColor = Color.Red
          End If
        Next
      End Sub
    
    #Region "Datenanlage"
      ''' <summary>Simuliert das Laden der DataTable</summary>
      Private Sub Fill()
        ' Hier Tabelle (im Designer) mit ID, Datum, Raum, Saal
        Dim table = Me.VeranstaltungenDataSet.Tables(VeranstaltungTableName)
        AddRow(table, New Date(2010, 10, 21), "Raum 1", "Saal")
        AddRow(table, New Date(2010, 10, 22), "Raum 1", "Saal")
        AddRow(table, New Date(2010, 10, 22), "Raum 1", "Saal")
        AddRow(table, New Date(2010, 10, 22), "Raum 1", "Schuppen")
        table.AcceptChanges()
      End Sub
    
      ''' <summary>Legt eine Zeile an</summary>
      Private Sub AddRow(ByVal table As DataTable, ByVal datum As Date, ByVal raum As String, ByVal saal As String)
        Dim row = table.NewRow()
        row(DatumColumnName) = datum
        row(RaumColumnName) = raum
        row(SaalColumnName) = saal
        table.Rows.Add(row)
      End Sub
    #End Region
    
    End Class
    
    
    

    Gruß Elmar

     

    Mittwoch, 4. August 2010 08:28
    Beantworter
  • Hallo Johannes,

    Meine Frage jetzt. Du machst mit mDT eine Neue DataTable welche
    DU mit Daten (Raum, Datum) füllst.

    Das wäre bei Dir "DeineDataTable", welche Du vermutlich mit Daten
    aus irgendeiner Datenbank gefüllt hast.

    Darauf machst DU dann den mDV. Ich selber brauch ja aber keine neue
    Datatable weil ich doch die Daten schon habe, ist das richtig?

    Ja, ich vermute, dass Du eine eigene DataTable (evtl. in einem DataSet)
    hast welche mit Daten aus Deiner Datenbank gefüllt worden ist.

    wie kann ich denn den mDV auf meine Datenbank, (DataSet oder
    DataGridView????) machen.

        dim DS As DataSet   ' Dein vorhandenes DataSet
        dim mDV as DataView
        mDV = new DataView(DS.Tables("DeineDataTable")

    Wenn Du Dein DGV an eine BindingSource gebunden hast

        DGV.DataSource = DeineBindingSource

    hast Du mit dieser BindingSource letztlich Dein DGV auch
    eine DataView (nämlich BindingSource.List) gebunden.

    Wenn Du Dir mal die Eigenschaften des BindingSource-Objektes
    genauer ansiehst, findest Du dort u.a.

        BindingSource.DataSource  (= DeineDataTable)
        BindingSource.List  (DataView)
        BindingSource.CurrencyManager

    DataTable ist die eigentliche Datenquelle,

    DataView ist eine sortierbare Liste von Zeigern auf die
    DataRows Deiner DataTable

    und mit dem CurrencyManager kannst Du innerhalb des
    Datenbestandes via CurrencyManager.Position navigieren.

    DataTable, DataView u. CurrencyManager kannst du als
    eigenständige Objekte erzeugen oder eben gekapselt in
    einer BindingSource.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 4. August 2010 09:35
  • Hallo Johannes,

    Habe deinen Vorschlag jetzt in FindDuplicates() eingebaut


    Private Sub FindDuplicates() Dim i As Integer Dim mDV As DataView = DirectCast(VeranstaltungenBindingSource.List, DataView) Dim DRV As DataRowView Dim DRVnext As DataRowView For i = 0 To mDV.Count - 2 DRV = mDV(i) DRVnext = mDV(i + 1) If DRV.Item(1).Equals(DRVnext(1)) Then If DRV.Item(4).Equals(DRVnext(4)) Then DataGridView1.Rows(i).DefaultCellStyle.BackColor = _ Color.Red DataGridView1.Rows(i + 1).DefaultCellStyle.BackColor = _ Color.Red End If End If Next End Sub

    DRV.Iten(1) ist die Spalte Datum
    DRV.Item(4) ist die Spalte Raum
    Leider werden die doppelten Einträge nicht markiert.

    In Deinem Code fehlt die notwendige Sortierung der DataView mDV wie Du sie in meinem ursprünglichen Code in der Sub CreateData() mit mDV.Sort = "Raum, Datum ASC" siehst. ... schnipp...

    Habe ich noch irgendwas vergessen oder habe ich deinen Beitrag falsch verstanden.

    s.oben: Du hast die für FindDuplicates() notwendige Sortierung der DataView (mDV) vergessen. Gruß aus St.Georgen Peter Götz www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 4. August 2010 09:46
  • Hallo

     

    habe jetzt in FindDuplicates() noch

     mDV.Sort = "Datum, Raum ASC"
    

    eingefügt

    sieht jetzt so aus

    'Doppelte Einträge Suchen
      Private Sub FindDuplicates()
    
        Dim i As Integer
        Dim mDV As DataView = DirectCast(VeranstaltungenBindingSource.List, DataView)
        mDV.Sort = "Datum, Raum ASC"
        Dim DRV As DataRowView
        Dim DRVnext As DataRowView
        For i = 0 To mDV.Count - 2
          DRV = mDV(i)
          DRVnext = mDV(i + 1)
    
    
          If DRV.Item(1).Equals(DRVnext(1)) Then
            If DRV.Item(4).Equals(DRVnext(4)) Then
    
              DataGridView1.Rows(i).DefaultCellStyle.BackColor = _
                  Color.Red
    
              DataGridView1.Rows(i + 1).DefaultCellStyle.BackColor = _
                  Color.Red
            End If
          End If
        Next
      End Sub
    

    leider werden doppelte Einträge nicht markiert.
    Ich habe in meiner Tabelle noch weitere Spalten

    ID  Datum  Bezeichnung  Teilnehmer  Raum  Abteilung  Speisen

    kann es daran liegen. Möchte nur die  Spalten Datum und Raum vergleichen und das sage ich doch in dieser Codezeile hier oder ?

    <strong> If DRV.Item(1).Equals(DRVnext(1)) Then
            If DRV.Item(4).Equals(DRVnext(4)) Then</strong>
    
    
    Ich habe auch das Beispiel von Elmar probiert leider markiert es mir die doppelten Einträge nicht, auch wenn ich es mit den Beispieldaten von Elmar versuche.

    Mittwoch, 4. August 2010 13:09
  • Hallo Johannes,

    der von mir gepostete Code funktioniert hier (die 2 und 3. Zeile ist Rot).
    Am Ende unterscheidet sich mein Beispiel von Peters nicht,
    nur dass ich (wie auch sonst) Spaltennamen verwende,
    weil Positionen (später mal) verrutschen können.

    Ursachen dafür, dass es bei Dir nicht funktioniert, könnten sein:
    Die Daten sind nicht wirklich identisch.
    So wäre bei dem jetzigen Vergleich "RAUM 1" und "Raum 1" ungleich,
    da Groß- / Kleinschreibung derzeit eine Rolle spielt.

    Gleiches gälte für ein Datum, bei dem ein Zeitanteil vorhanden ist,
    aber auf Grund der Formateinstellungen nicht angezeigt wird.

    Sollte dieser oder eine andere Konstellation zutreffen, so wird man
    keine Treffer haben und müßte sich eine eigene Vergleichsroutine schreiben.

    Gruß Elmar

    Mittwoch, 4. August 2010 14:26
    Beantworter
  • Hallo Johannes

    leider werden doppelte Einträge nicht markiert.

    Wenn Du mein ursprüngliches Beispiel 1:1 übernimmst
    funktioniert das Markieren der Duplikate mit Sicherheit.

    Ich habe in meiner Tabelle noch weitere Spalten

    ID Datum Bezeichnung Teilnehmer Raum Abteilung Speisen

    kann es daran liegen. Möchte nur die Spalten Datum und*Raum*
    vergleichen und das sage ich doch in dieser Codezeile hier oder ?

    Weitere Spalten haben keinen negativen Einfluss.

    *


    <strong> If DRV.Item(1).Equals(DRVnext(1)) Then If DRV.Item(4).Equals(DRVnext(4)) Then</strong>

    *Ich habe auch das Beispiel von Elmar probiert leider markiert es mir die doppelten Einträge nicht, auch wenn ich es mit den Beispieldaten von Elmar versuche.*

    Wie Elmar auch schon vermutet, kann es eigentlich nur an Deinen Daten, die bei Duplikaten eben doch nicht wirklich gleich sind, liegen. Beim Datum kann zwar der Tag gleich sein, enthält das Feld aber auch noch einen Zeitanteil, so kann sich dieser vom Zeitanteil eines gleichen Tages unterscheiden. Du musst also z.B. dafür sorgen, dass Deine Datumseinträge keinen Zeitanteil haben, also immer die Uhrzeit 00:00:00 haben, was dann z.B. so aussehen würde: Dim D as Date = New Date(2010, 8, 4, 0,0,0) Bei den Raumbezeichnungen ist, wie Elmar schon erwähnt hat, auf Gross- u. Kleinschreibung zu achten. Gruß aus St.Georgen Peter Götz www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 4. August 2010 18:38
  • Hallo,

     

    habe es jetzt geschafft. Allerdings wird FindDuplicates nicht mit dem Form1_Load ausgeführt. Habe es zum testen auf einen Button_Click gelegt und erst wenn ich diesen Button drücke werden die doppelten Einträge markiert. Warum auch immer.

    Das gleiche ist auch bei:

     

    Me
    
    .DataGridView1.AutoResizeColumns()
      Me
    
    .DataGridView1.AutoResizeRows()
    

     

    die Spalten und Reihen werden erst nach dem Button_Click automatisch angepasst. Woran kann das liegen.

     Me.DataGridView1.DefaultCellStyle.Font = New Font("Tahoma", 9)
    Diese Zuweisung der Schriftart wird allerdings beim Form_Load ausgeführt.

     

    Danke Johannes

    Donnerstag, 5. August 2010 06:41
  • Hallo,

    habe es jetzt geschafft. Allerdings wird FindDuplicates nicht mit
    dem Form1_Load ausgeführt. Habe es zum testen auf einen
    Button_Click gelegt und erst wenn ich diesen Button drücke
    werden die doppelten Einträge markiert. Warum auch immer.

    Wenn Du in Form_Load ein Control wie z.B. das DGV uneingeschränkt
    (nicht nur Eigenschaften, sondern auch alle Methoden) ansprechen willst,
    musst Du sicherstellen, dass dieses Control auch schon wirklich
    vollständig geladen ist. Da ich Deinen konkreten Programmcode nicht
    kenne, kann ich nicht beurteilen, ob und wann Dein DGV komplett geladen
    und ansprechbar ist.

    Das gleiche ist auch bei:

    Me
    .DataGridView1.AutoResizeColumns()
     Me
    .DataGridView1.AutoResizeRows()
    

    die Spalten und Reihen werden erst nach dem Button_Click
    automatisch angepasst. Woran kann das liegen.

    Auch hierfür gilt das oben Gesagte. Nur wenn Dein DataGridView1
    vollständig geladen ist, kannst Du die Methoden AutoResizeColumns()
    und AutoResizeRows ausführen. Hinzu kommt noch, dass beides nur
    Sinn macht, wenn das DGV bereits mit irgendeiner Datenquelle
    verbunden ist, die auch wirklich Daten liefert. Ein leeres DGV ohne
    jegliche Daten hat weder Zeilen noch Spalten die man "resizen"
    könnte.

    Form_Load dürfte in Deinem Fall eher nicht der geeignete
    Moment sein. Verlege das Ganze mal nach Form_Shown.
    Zum Zeitpunkt des Ereignisses Form_Shown ist sichergestellt,
    dass alle Controls geladen und dann auch uneingeschränkt
    ansprechbar sind.

    Me.DataGridView1.DefaultCellStyle.Font = New Font("Tahoma", 9)

    Diese Zuweisung der Schriftart wird allerdings beim
    Form_Load ausgeführt.

    Hier greifst Du auf eine Eigenschaft zu, im Gegensatz zu oben,
    wo Du eine Methode ausführen willst.

    Gruß aus St.Georgen
    Peter Götz
    www.gssg.de (mit VB-Tipps u. Beispielprogrammen)

    Mittwoch, 11. August 2010 11:10