none
Wie kann ich eine Zeile in einem DataGridView selektieren ohne MouseClick RRS feed

  • Frage

  •  Hallo Leute,

     

    wie kann ich eine Zeile in einem DataGridView markieren, so das ich Sie gleich auslesen kann!? Momentan muss ich den Mouse Cursor auf die gewünschte Zeile setzen und dann Linke Maustaste klicken damit das aufgerufen wird:

     

    Private Sub DataGridView1_RowHeaderMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DataGridView1.RowHeaderMouseClick

     

     Also um es kurz zu sagen möchte ich per Code eine Zeile im DGV markieren(Dreieickspfeil) und auslesen.

     

    Vielen Dank
    Montag, 18. Oktober 2010 13:47

Antworten

  • Hallo,

    wie kann ich eine Zeile in einem DataGridView markieren, so das
    ich Sie gleich auslesen kann!? Momentan muss ich den Mouse
    Cursor auf die gewünschte Zeile setzen und dann Linke Maustaste
    klicken damit das aufgerufen wird:

    Private Sub DataGridView1_RowHeaderMouseClick _
           (ByVal sender As Object, _
            ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs _
           ) Handles DataGridView1.RowHeaderMouseClick

    Also um es kurz zu sagen möchte ich per Code eine Zeile im DGV
    markieren(Dreieickspfeil) und auslesen.

    Im nachfolgenden Beispiel siehst Du wie Du einen beliebigen
    Datensatz im DGV resp. in der dem DGV zugeordneten DataSource
    auswählen kannst und auch, wie Du an die Feldwerte des
    ausgewählten Datensatzes herankommst.

    Kopiere nachfolgenden Code einfach in ein leeres Formmodul (Form1.vb)

    ' / / / Beginn Code
    Public Class Form1
        Private mDT As DataTable
        Private WithEvents mBS As BindingSource

        Private WithEvents DGV As DataGridView
        Private WithEvents btnFirst As Button
        Private WithEvents btnPrevious As Button
        Private WithEvents btnNext As Button
        Private WithEvents btnLast As Button

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

            CreateControls()
            CreateData()
            DGV.DataSource = mBS

        End Sub

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

            DGV.Columns(0).DefaultCellStyle.Alignment = _
                    DataGridViewContentAlignment.MiddleRight

            DGV.AutoResizeColumns()
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("LText", GetType(String))
                .Columns.Add("SText", GetType(String))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i, False)
                    DR.Item(2) = MonthName(i, True)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mBS = New BindingSource
            mBS.DataSource = mDT
        End Sub

        Private Sub CreateControls()
            DGV = New DataGridView
            With DGV
                .Name = "DGV"
                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 70)

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

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

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

            End With
            Me.Controls.Add(DGV)

            btnFirst = New Button
            With btnFirst
                .Name = "btnFirst"
                .SetBounds(10, DGV.Bottom + 10, 40, 40)
                .Text = "|<"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnFirst)

            btnPrevious = New Button
            With btnPrevious
                .Name = "btnPrevious"
                .SetBounds(btnFirst.Right + 2, btnFirst.Top, 40, 40)
                .Text = "<"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnPrevious)

            btnNext = New Button
            With btnNext
                .Name = "btnNext"
                .SetBounds(btnPrevious.Right + 2, btnFirst.Top, 40, 40)
                .Text = ">"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnNext)

            btnLast = New Button
            With btnLast
                .Name = "btnLast"
                .SetBounds(btnNext.Right + 2, btnFirst.Top, 40, 40)
                .Text = ">|"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnLast)
        End Sub

        Private Sub NavButton_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles _
                        btnFirst.Click, _
                        btnPrevious.Click, _
                        btnNext.Click, _
                        btnLast.Click

            Select Case True
                Case sender Is btnFirst
                    mBS.Position = 0

                Case sender Is btnPrevious
                    mBS.Position -= 1

                Case sender Is btnNext
                    mBS.Position += 1

                Case sender Is btnLast
                    mBS.Position = mBS.Count - 1

            End Select

        End Sub

        Private Sub mBS_PositionChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles mBS.PositionChanged

            Dim DRV As DataRowView = _
                    DirectCast(mBS.Current, DataRowView)

            ' Werte aus der DataRowView des akt.
            ' ausgewählten Datensatzes lesen:
            Me.Text = _
                    DRV.Item(0).ToString & "  " & _
                    DRV.Item(1).ToString & "  " & _
                    DRV.Item(2).ToString

        End Sub

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

            ' Werte aus DGV.CurrentRow.Cells(x) lesen:
            If DGV.CurrentRow IsNot Nothing Then
                Dim Buffer As String
                With DGV.CurrentRow
                    Buffer = _
                        (DGV.CurrentRow.Cells(0).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(1).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(2).Value.ToString)
                End With
                Console.WriteLine(Buffer)
            End If
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einem DataGridView
    und vier Buttons, mit denen Du im Datenbestand navigieren kannst.
    Ein Klick auf einen dieser Buttons führt Code aus, der den ersten,
    vorhergehenden, nächsten oder letzten Datensatz markiert.

    In Sub mBS_PositionChanged() wird direkt auf die akt. DataRowView
    der DGV.DataSource zugegriffen.

    In Sub DGVC_CurrentCellChanged wird auf DGV.CurrentRow.Cells(x)
    zugegriffen.

    Die Nummer der akt. ausgewählten Zeile bekommst Du mit

        Dim RowNumber as integer = mBS.Position

    wobei die erste Zeile den Wert 0 und die letzte Zeile den
    Wert mBS.Count-1 hat.
    Ist keine Zeile ausgewählt, dann liefert mBS.Position den Wert -1.

    Mit

        mBS.Position = Zeilennummer

    kannst Du eine beliebige Zeilennummer innerhalb des
    Datenbestandes auswählen.

    Mehr Beispiele mit dem DataGridView findest Du unter

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGridView

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

    Montag, 18. Oktober 2010 17:01
  • Hallo nochmal,

    ich weiss nicht, warum diese Forensoftware heute glaubt,
    alles und jedes nach Gutdünken kaputtformatieren zu müssen,
    deshalb ein erneuter Versuch, mein Posting lesbar auf den
    Weg zu bringen.

    meine Listbox ist gefüllt mit Text nach dem Schema:

    Nachname_Vorname_ID

    dieser ensteht, da ich TXT Dateien nach bestimmten Suchbegriffen mittels
    RegEx durchsuche. Sollte ein Treffer vorkommen bildet mein Programm
    einen Listbox Eintag nach folgenden Code:

    [code]

         If TrefferJaNein = True Then        _
     ' Wenn Schleife NICHT vorzeitig beendet wurde

           'ListBox1.Items.Add(Datei)

           Dim Teil1 As String

           Teil1 = System.IO.Path.GetDirectoryName(Datei)
           ListBox1.Items.Add(".." & Datei.Substring(Teil1.Length))
           Label6.Text = ListBox1.Items.Count

           Application.DoEvents()

    Was soll dieses .DoEvents bewirken?

         End If

    Dies geschieht natürlich in einer Schleife für mehere tausend Textdateien.

    Und wie lange dauert es bis Du mehrere tausend Textdateien nach
    bestimmten Begriffen durchsucht hast?

    Wenn sämtliche Trefferdateien in der Listbox abgebildet sind kann ich per:

     Private Sub ListBox1_SelectedValueChanged _
             (ByVal sender As Object, _
              ByVal e As System.EventArgs _
             ) Handles ListBox1.SelectedValueChanged

         ListBox3.Visible = False
         ListBox3.Items.Clear()
         'dv = New DataView(dt)
         'If dv.RowFilter = "" Then
         DataGridView1.DataSource = dt

    Wie und wo dt deklariert, erstellt und mit welchen Daten gefüllt wird
    sehe ich bisher immer noch nicht.

         'End If
         Auswahl()
     End Sub

    und

     Sub Auswahl()
         Dim Eintrag As String
         Dim Von, Bis As Integer

         Dim Zeilenwert As Integer

         Eintrag = ListBox1.SelectedItem
         Von = Eintrag.LastIndexOf("_") + 1
          Bis = Eintrag.LastIndexOf(".") <br/>
          ID = Eintrag.Substring(Von, Bis - Von)

          For Each Zeile As DataGridViewRow In DataGridView1.Rows
              If Zeile.Cells("ID").Value = ID Then
                  Zeilenwert = Zeile.Index
                  'DataGridView1.Rows(Zeilenwert).Selected = True

                  DataGridView1.Rows(Zeilenwert).Selected = _
                          DataGridViewSelectionMode.FullRowSelect

                  DataGridView1.FirstDisplayedScrollingRowIndex = Zeilenwert

                  Exit For
              End If
          Next
     End Sub

    direkt im DataGridView in den passenden Datensatz welcher aus
    dem Listbox Eintrag extrahiert wird springen.

    Eine Zeile mit einer bestimmten ID im Datenbestand einer DataTable
    kann man deutlich einfacher und schneller mit BindingSource.Find()
    ermitteln.
    Voraussetzung dafür ist, dass man vorher die Spalte ID als
    Primärschlüssel definiert hat (s.Code im Beispiel unten).

    Also der Datensatz: ..\Nachname_Vorname_ID wird zerlegt und
    die ID für die relvante Suche im DataGridView herangezogen.

    Dann wird die dementsprechende Zeile im DataGridView markiert.
    Jedoch ohne das dieser Zeile "der Pfeil" sprich der Datensatzmarker
    voransteht.

    Ich möchte also in der Listbox ein Eintrag auswählen, dieser soll dann
    im DataGridview angezeigt werden und gleichzeitig auf diesen Datensatz
    der Marker gesetzt werden.

    Welcher "Marker" soll auf den Datensatz gesetzt werden?
    Im vorigen Satz hast Du gefordert, dass der "Pfeil" nicht auf
    diesem Datensatz stehen soll.
    Was denn nun?

    Sorry ist halt ein wenig schwierig zu beschreiben.

    Das ist meist ein Zeichen dafür, dass das gewählte Programmkonzept
    möglicherweise doch noch nicht so ganz gründlich durchdacht ist.

    Hier mal mein früheres Beispiel mit einer Erweiterung um eine ComboBox
    in welcher nach Auswahl eines bestimmten Eintrages die hierzu passende
    Zeile im DGV markiert wird, der Datensatzmarkierer (Pfeil) jedoch auf der
    bisher gewählten Zeile verbleibt.

    ' / / /  Code in Formmodul (Form1.vb)
    Public Class Form1
        Private WithEvents CBox As ComboBox
        Private mDT As DataTable
        Private WithEvents mBS As BindingSource

        Private mMonTable As DataTable

        Private WithEvents DGV As DataGridView
        Private WithEvents btnFirst As Button
        Private WithEvents btnPrevious As Button
        Private WithEvents btnNext As Button
        Private WithEvents btnLast As Button

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

            CreateControls()
            CreateData()
            DGV.DataSource = mBS

            With CBox
                .DataSource = mMonTable.DefaultView

                .DisplayMember = _
                        mMonTable.Columns(1).ColumnName

                .ValueMember = _
                        mMonTable.Columns(0).ColumnName
            End With
        End Sub

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

            DGV.Columns(0).DefaultCellStyle.Alignment = _
                    DataGridViewContentAlignment.MiddleRight

            DGV.AutoResizeColumns()
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("LText", GetType(String))
                .Columns.Add("SText", GetType(String))

                ' Spalte 0 (ID) als Primärschlüsselspalte definieren
                .Constraints.Add("PKey", .Columns(0), True)

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i, False)
                    DR.Item(2) = MonthName(i, True)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mBS = New BindingSource
            mBS.DataSource = mDT

            mMonTable = New DataTable
            With mMonTable
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Text", GetType(String))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With
        End Sub

        Private Sub CreateControls()

            CBox = New ComboBox
            With CBox
                .Name = "CBox"
                .Font = New Font("Arial", 14)

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         .Height)

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

                .DropDownStyle = _
                        ComboBoxStyle.DropDownList

            End With
            Me.Controls.Add(CBox)

            DGV = New DataGridView
            With DGV
                .Name = "DGV"
                .SetBounds _
                        (10, CBox.Bottom + 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - _
                            (CBox.Bottom + 70))

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

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

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

            End With
            Me.Controls.Add(DGV)

            btnFirst = New Button
            With btnFirst
                .Name = "btnFirst"

                .SetBounds _
                        (10, DGV.Bottom + 10, _
                         40, 40)

                .Text = "|<"

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnFirst)

            btnPrevious = New Button
            With btnPrevious
                .Name = "btnPrevious"

                .SetBounds _
                        (btnFirst.Right + 2, _
                         btnFirst.Top, _
                         40, 40)

                .Text = "<"

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

            End With
            Me.Controls.Add(btnPrevious)

            btnNext = New Button
            With btnNext
                .Name = "btnNext"

                .SetBounds _
                        (btnPrevious.Right + 2, _
                         btnFirst.Top, _
                         40, 40)

                .Text = ">"

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

            End With
            Me.Controls.Add(btnNext)

            btnLast = New Button
            With btnLast
                .Name = "btnLast"

                .SetBounds _
                        (btnNext.Right + 2, _
                         btnFirst.Top, _
                         40, 40)

                .Text = ">|"

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

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

        Private Sub NavButton_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles _
                        btnFirst.Click, _
                        btnPrevious.Click, _
                        btnNext.Click, _
                        btnLast.Click

            Select Case True
                Case sender Is btnFirst
                    mBS.Position = 0

                Case sender Is btnPrevious
                    mBS.Position -= 1

                Case sender Is btnNext
                    mBS.Position += 1

                Case sender Is btnLast
                    mBS.Position = mBS.Count - 1

            End Select

        End Sub

        Private Sub mBS_PositionChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles mBS.PositionChanged

            Dim DRV As DataRowView = _
                    DirectCast(mBS.Current, DataRowView)

            ' Werte aus der DataRowView des akt.
            ' ausgewählten Datensatzes lesen:
            Me.Text = _
                    DRV.Item(0).ToString & "  " & _
                    DRV.Item(1).ToString & "  " & _
                    DRV.Item(2).ToString

        End Sub

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

            ' Werte aus DGV.CurrentRow.Cells(x) lesen:
            If DGV.CurrentRow IsNot Nothing Then
                Dim Buffer As String
                With DGV.CurrentRow
                    Buffer = _
                        (DGV.CurrentRow.Cells(0).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(1).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(2).Value.ToString)
                End With
                Console.WriteLine(Buffer)
            End If
        End Sub

        Private Sub CBox_SelectedIndexChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles CBox.SelectedIndexChanged

            Dim ID As Integer
            Dim RowNum As Integer

            ID = _
                CInt _
                    (DirectCast _
                    (CBox.SelectedItem,  _
                    DataRowView).Item(0))

            ' Zeilennummer mit der gesuchten ID ermitteln
            RowNum = mBS.Find("ID", ID)

            If RowNum > -1 Then
                ' bisherige Zeilenmarkierungen zurücksetzen
                Do While DGV.SelectedRows.Count > 0
                    DGV.SelectedRows(0).Selected = False
                Loop
                ' Zeile mit RowNum markieren
                DGV.Rows(RowNum).Selected = True
                ' markierte Zeile in sichtbaren Bereich scrollen
                DGV.FirstDisplayedScrollingRowIndex = RowNum
            End If
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1, diesmal mit einer
    ComboBox (CBox), einem DataGridView (DGV) und den vom
    vorigen Beispiel schon bekannten Navigationsbuttons.

    Mit jeder neuen Auswahl in der ComboBox wird der zur dieser
    Auswahl (ID) passende Datensatz im DGV markiert, der
    Datensatzmarkierer (Pfeil) bleibt auf dem bisher gewählten
    Datensatz.

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

    Dienstag, 19. Oktober 2010 16:56

Alle Antworten

  • Hallo,

    wie kann ich eine Zeile in einem DataGridView markieren, so das
    ich Sie gleich auslesen kann!? Momentan muss ich den Mouse
    Cursor auf die gewünschte Zeile setzen und dann Linke Maustaste
    klicken damit das aufgerufen wird:

    Private Sub DataGridView1_RowHeaderMouseClick _
           (ByVal sender As Object, _
            ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs _
           ) Handles DataGridView1.RowHeaderMouseClick

    Also um es kurz zu sagen möchte ich per Code eine Zeile im DGV
    markieren(Dreieickspfeil) und auslesen.

    Im nachfolgenden Beispiel siehst Du wie Du einen beliebigen
    Datensatz im DGV resp. in der dem DGV zugeordneten DataSource
    auswählen kannst und auch, wie Du an die Feldwerte des
    ausgewählten Datensatzes herankommst.

    Kopiere nachfolgenden Code einfach in ein leeres Formmodul (Form1.vb)

    ' / / / Beginn Code
    Public Class Form1
        Private mDT As DataTable
        Private WithEvents mBS As BindingSource

        Private WithEvents DGV As DataGridView
        Private WithEvents btnFirst As Button
        Private WithEvents btnPrevious As Button
        Private WithEvents btnNext As Button
        Private WithEvents btnLast As Button

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

            CreateControls()
            CreateData()
            DGV.DataSource = mBS

        End Sub

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

            DGV.Columns(0).DefaultCellStyle.Alignment = _
                    DataGridViewContentAlignment.MiddleRight

            DGV.AutoResizeColumns()
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("LText", GetType(String))
                .Columns.Add("SText", GetType(String))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i, False)
                    DR.Item(2) = MonthName(i, True)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mBS = New BindingSource
            mBS.DataSource = mDT
        End Sub

        Private Sub CreateControls()
            DGV = New DataGridView
            With DGV
                .Name = "DGV"
                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - 70)

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

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

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

            End With
            Me.Controls.Add(DGV)

            btnFirst = New Button
            With btnFirst
                .Name = "btnFirst"
                .SetBounds(10, DGV.Bottom + 10, 40, 40)
                .Text = "|<"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnFirst)

            btnPrevious = New Button
            With btnPrevious
                .Name = "btnPrevious"
                .SetBounds(btnFirst.Right + 2, btnFirst.Top, 40, 40)
                .Text = "<"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnPrevious)

            btnNext = New Button
            With btnNext
                .Name = "btnNext"
                .SetBounds(btnPrevious.Right + 2, btnFirst.Top, 40, 40)
                .Text = ">"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnNext)

            btnLast = New Button
            With btnLast
                .Name = "btnLast"
                .SetBounds(btnNext.Right + 2, btnFirst.Top, 40, 40)
                .Text = ">|"
                .Anchor = AnchorStyles.Left Or AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnLast)
        End Sub

        Private Sub NavButton_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles _
                        btnFirst.Click, _
                        btnPrevious.Click, _
                        btnNext.Click, _
                        btnLast.Click

            Select Case True
                Case sender Is btnFirst
                    mBS.Position = 0

                Case sender Is btnPrevious
                    mBS.Position -= 1

                Case sender Is btnNext
                    mBS.Position += 1

                Case sender Is btnLast
                    mBS.Position = mBS.Count - 1

            End Select

        End Sub

        Private Sub mBS_PositionChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles mBS.PositionChanged

            Dim DRV As DataRowView = _
                    DirectCast(mBS.Current, DataRowView)

            ' Werte aus der DataRowView des akt.
            ' ausgewählten Datensatzes lesen:
            Me.Text = _
                    DRV.Item(0).ToString & "  " & _
                    DRV.Item(1).ToString & "  " & _
                    DRV.Item(2).ToString

        End Sub

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

            ' Werte aus DGV.CurrentRow.Cells(x) lesen:
            If DGV.CurrentRow IsNot Nothing Then
                Dim Buffer As String
                With DGV.CurrentRow
                    Buffer = _
                        (DGV.CurrentRow.Cells(0).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(1).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(2).Value.ToString)
                End With
                Console.WriteLine(Buffer)
            End If
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1 mit einem DataGridView
    und vier Buttons, mit denen Du im Datenbestand navigieren kannst.
    Ein Klick auf einen dieser Buttons führt Code aus, der den ersten,
    vorhergehenden, nächsten oder letzten Datensatz markiert.

    In Sub mBS_PositionChanged() wird direkt auf die akt. DataRowView
    der DGV.DataSource zugegriffen.

    In Sub DGVC_CurrentCellChanged wird auf DGV.CurrentRow.Cells(x)
    zugegriffen.

    Die Nummer der akt. ausgewählten Zeile bekommst Du mit

        Dim RowNumber as integer = mBS.Position

    wobei die erste Zeile den Wert 0 und die letzte Zeile den
    Wert mBS.Count-1 hat.
    Ist keine Zeile ausgewählt, dann liefert mBS.Position den Wert -1.

    Mit

        mBS.Position = Zeilennummer

    kannst Du eine beliebige Zeilennummer innerhalb des
    Datenbestandes auswählen.

    Mehr Beispiele mit dem DataGridView findest Du unter

        www.gssg.de -> Visual Basic -> VB.net
            -> DataGridView

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

    Montag, 18. Oktober 2010 17:01
  • Hallo,

    also in meiner Anwendung habe ich die daten über eine Binding Source vorliegen. Ist das in Ihrem Fall ebenso?

    -BindingSource hat u.a. 4 Methoden: MoveFirst, MoveNext, MoveLast, MovePrevious

    -das Event "SelectionChanged" eignet sich dann ideal zum verarbeiten der Daten

    -über sender.SelectedRows(0) bekommt man dan die aktuelle Zeile

     

    MfG

    Okeanos

    Dienstag, 19. Oktober 2010 06:18
  • Hallo,

    also in meiner Anwendung habe ich die daten über eine
    Binding Source vorliegen. Ist das in Ihrem Fall ebenso?

    Ich verstehe die Frage nicht so recht.
    Im Code aus meinem vorigen Posting ist doch deutlich
    eine Deklaration

        Private WithEvents mBS As BindingSource

    zu erkennen und in der Sub CreateData wird per

        mBS = New BindingSource
        mBS.DataSource = mDT

    eine Instanz einer BindingSource erstellt und dieser
    die DataTable mDT als DataSource zugewiesen. ´
    Das DataGridView (DGV) wird dann in der
    Sub Form1_Load mit

        DGV.DataSource = mBS

    an diese BindingSource gebunden.

    Hast Du das Beispiel denn nicht ausprobiert und
    den Code angesehen?

    -BindingSource hat u.a. 4 Methoden: MoveFirst,
     MoveNext, MoveLast, MovePrevious

    Ja, die nichts anderes machen als

        With mBS
            .Position = 0
            .Position - = 1
            .Position + = 1
            .Position = .Count - 1
        End With

    Der Ereignishandler Sub NavButton_Click() aus meinem
    Beispiel könnte also genausogut so aussehen:

        Private Sub NavButton_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles _
                        btnFirst.Click, _
                        btnPrevious.Click, _
                        btnNext.Click, _
                        btnLast.Click

            Select Case True
                Case sender Is btnFirst
                    'mBS.Position = 0
                    mBS.MoveFirst()

                Case sender Is btnPrevious
                    'mBS.Position -= 1
                    mBS.MovePrevious()

                Case sender Is btnNext
                    'mBS.Position += 1
                    mBS.MoveNext()

                Case sender Is btnLast
                    'mBS.Position = mBS.Count - 1
                    mBS.MoveLast()

            End Select
        End Sub

    Ich habe bewusst die Eigenschaft .Position verwendet um zu
    zeigen, dass man aus dem Programmcode heraus  mit
    BindingSource.Position eben zu jedem beliebigen Datensatz
    wechseln kann.

    Will man z.B. zum 25. Datensatz wechseln dann schreibt man
    eben

        BindingSource.Position = 24

    24 deshalb, weil .Position Nullbasiert ist, also beim Wert 0 zu
    zählen beginnt.

    -das Event "SelectionChanged" eignet sich dann ideal zum
    verarbeiten der Daten

    DGV_SelectionChanged wir zwar auch ausgelöst, wenn man einen
    Zeilenwechsel vornimmt, aber auch dann, wenn z.B. innerhalb einer
    Zeile in eine andere Zelle gewechselt wird oder wenn innerhalb einer
    Zeile mehrere Zellen markiert werden bzw. eben immer dann, wenn
    sich der Zustand der jeweils akt. Markierung, egal ob mehrere Zeilen
    oder mehrere Zellen, ändert.

    Das Ereignis BindingSource.PositionChanged dagegen signalisiert
    eindeutig einen Datensatzwechsel (Zeilenwechsel). Man ist mit
    BindingSource.PositionChanged "näher am Geschehen".

    -über sender.SelectedRows(0) bekommt man dan die aktuelle Zeile

    DataGridView.SelectedRows liefert eine Auflistung aller selektierten
    Zeilen. Dies können Null Zeilen sein (DGV.SelectedRows.Count = 0)
    oder auch mehrere (DGV.SelectedRows.Count = > 0).
    DGV.SelectedRows(0) ist dann die Zeile mit dem Zeilenmarkierer
    (Pfeil) am linken Rand.

    Auch hier ist man mit

        Dim DRV as DataRowView
        DRV = Directcast(mBS.Current, DataRowView)

    viel näher am Geschehen.

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

    Dienstag, 19. Oktober 2010 07:35
  • Hallo,

    das der Pfeil beim Wechseln der Datensätze wandert sehe ich, aber ich möchte gerne das die ganze Zeile markiert wird und dann Pfeil auf diese Zeile gesetzt wird.

    Momentan habe ich folgendes:

      Private Sub ListBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedValueChanged
        ListBox3.Visible = False
        ListBox3.Items.Clear()
        dv = New DataView(dt)
        If dv.RowFilter = "" Then
          DataGridView1.DataSource = dt
        End If
    
        Auswahl()
    
      End Sub
    
    
      Sub Auswahl()
        Dim Eintrag As String
        Dim Von, Bis As Integer
    
        Dim Zeilenwert As Integer
    
        Eintrag = ListBox1.SelectedItem
        Von = Eintrag.LastIndexOf("_") + 1
        Bis = Eintrag.LastIndexOf(".")
        CulpID = Eintrag.Substring(Von, Bis - Von)
    
    
        For Each Zeile As DataGridViewRow In DataGridView1.Rows
          If Zeile.Cells("ID").Value = ID Then
            Zeilenwert = Zeile.Index
            DataGridView1.Rows(Zeilenwert).Selected = True
            DataGridView1.FirstDisplayedScrollingRowIndex = Zeilenwert
    
            Exit For
          End If
    
        Next
      End Sub
    

    Somit kann ich wenn ich in meiner Listbox einen anderen Eintrag anklicke direkt im Datagridview in die passende Zeile springen, jedoch ohne das der Pfeil der Selektion davor erscheint. Hinterlegt ist die Zeile.

     

    LG

     

    Chris

    Dienstag, 19. Oktober 2010 09:04
  • Hallo,

    das der Pfeil beim Wechseln der Datensätze wandert sehe ich,
    aber ich möchte gerne das die ganze Zeile markiert wird und
    dann Pfeil auf diese Zeile gesetzt wird.

    Wenn die jeweils akt. ausgewählte Zeile vollständig markiert sein
    soll, dann setze

        DGV.SelectionMode = DataGridViewSelectionMode.FullRowSelect

    Wie wäre es mal mit ein bisschen Online-Hilfe lesen? ;-)

    Momentan habe ich folgendes:


    Private Sub ListBox1_SelectedValueChanged _ (ByVal sender As Object, _ ByVal e As System.EventArgs _ ) Handles ListBox1.SelectedValueChanged ListBox3.Visible = False ListBox3.Items.Clear() dv = New DataView(dt) If dv.RowFilter = "" Then

    Was soll das werden? Wenn Du eine neue DataView (dv) erstellst, dann ist dv.RowFilter immer erst mal = "". Wozu also diese Abfrage?

    DataGridView1.DataSource = dt

    Wer oder was ist dt? Ich rate mal, dass es eine DataTable ist. Wenn das so ist, wie und wo erstellst Du diese DataTable? Warum bindest Du DataGridView1 an dt und nicht an die DataView dv?

    End If Auswahl() End Sub Sub Auswahl() Dim Eintrag As String Dim Von, Bis As Integer Dim Zeilenwert As Integer Eintrag = ListBox1.SelectedItem Von = Eintrag.LastIndexOf("_") + 1 Bis = Eintrag.LastIndexOf(".") CulpID = Eintrag.Substring(Von, Bis - Von) For Each Zeile As DataGridViewRow In DataGridView1.Rows If Zeile.Cells("ID").Value = ID Then Zeilenwert = Zeile.Index DataGridView1.Rows(Zeilenwert).Selected = True DataGridView1.FirstDisplayedScrollingRowIndex = Zeilenwert Exit For End If Next End Sub

    Ich verstehe nicht so recht, was dies Sub Auswahl() bewirken soll,
    da nicht klar ist, ob und woran Deine Listbox gebunden ist, bzw.
    welche Daten sie sonst enthält und woher sie diese bekommt.

    Somit kann ich wenn ich in meiner Listbox einen anderen Eintrag
    anklicke direkt im Datagridview in die passende Zeile springen,

    Ich verstehe hier nur "Bahnhof".
    Was enthält denn so ein Listbox-Eintrag? Oder anders gefragt,
    wie (Code) konkret sieht ein Listbox1.SelectedItem aus?

    jedoch ohne das der Pfeil der Selektion davor erscheint.
    Hinterlegt ist die Zeile.

    Auch hier grosses Fragezeichen.
    Was willst Du erreichen?
    Soll im DGV der akt. Datensatz, also der mit dem Pfeil
    z.B. der Datensatz aus der Zeile 3 sein, jedoch sollen die
    Zellen des Datensatzes 7 markiert sein?
    ...oder wie oder was?

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

    Dienstag, 19. Oktober 2010 10:25
  • Hallo nochmal,

    beim vorigen Posting hat diese unselige Forensoftware
    wieder mal alles kaputtformatiert.
    Hier nochmal das Ganze in jetzt hoffentlich lesbarer Form.

    das der Pfeil beim Wechseln der Datensätze wandert sehe ich,
    aber ich möchte gerne das die ganze Zeile markiert wird und
    dann Pfeil auf diese Zeile gesetzt wird.

    Wenn die jeweils akt. ausgewählte Zeile vollständig markiert sein
    soll, dann setze

        DGV.SelectionMode = DataGridViewSelectionMode.FullRowSelect

    Wie wäre es mal mit ein bisschen Online-Hilfe lesen? ;-)

    Momentan habe ich folgendes:


    Private Sub ListBox1_SelectedValueChanged _ (ByVal sender As Object, _ ByVal e As System.EventArgs _ ) Handles ListBox1.SelectedValueChanged ListBox3.Visible = False ListBox3.Items.Clear() dv = New DataView(dt) If dv.RowFilter = "" Then

    Was soll das werden? Wenn Du eine neue DataView (dv) erstellst,
    dann ist dv.RowFilter immer erst mal = "".
    Wozu also diese Abfrage?

    DataGridView1.DataSource = dt

    Wer oder was ist dt? Ich rate mal, dass es eine DataTable ist.
    Wenn das so ist, wie und wo erstellst Du diese DataTable?
    Warum bindest Du DataGridView1 an dt und nicht an die DataView dv?

        End If
        Auswahl()
    End Sub

    Sub Auswahl()
        Dim Eintrag As String
        Dim Von, Bis As Integer
        Dim Zeilenwert As Integer Eintrag = ListBox1.SelectedItem
        Von = Eintrag.LastIndexOf("_") + 1
        Bis = Eintrag.LastIndexOf(".")
        CulpID = Eintrag.Substring(Von, Bis - Von)
        For Each Zeile As DataGridViewRow In DataGridView1.Rows
            If Zeile.Cells("ID").Value = ID Then
                Zeilenwert = Zeile.Index
                DataGridView1.Rows(Zeilenwert).Selected = True
                DataGridView1.FirstDisplayedScrollingRowIndex = Zeilenwert
                Exit For
            End If
        Next
    End Sub

    Ich verstehe nicht so recht, was dies Sub Auswahl() bewirken soll,
    da nicht klar ist, ob und woran Deine Listbox gebunden ist, bzw.
    welche Daten sie sonst enthält und woher sie diese bekommt.

    Somit kann ich wenn ich in meiner Listbox einen anderen Eintrag
    anklicke direkt im Datagridview in die passende Zeile springen,

    Ich verstehe hier nur "Bahnhof".
    Was enthält denn so ein Listbox-Eintrag? Oder anders gefragt,
    wie (Code) konkret sieht ein Listbox1.SelectedItem aus?

    jedoch ohne das der Pfeil der Selektion davor erscheint.
    Hinterlegt ist die Zeile.

    Auch hier grosses Fragezeichen.
    Was willst Du erreichen?
    Soll im DGV der akt. Datensatz, also der mit dem Pfeil
    z.B. der Datensatz aus der Zeile 3 sein, jedoch sollen die
    Zellen des Datensatzes 7 markiert sein?
    ...oder wie oder was?

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

    Dienstag, 19. Oktober 2010 10:35
  • Hallo,

    meine Listbox ist gefüllt mit Text nach dem Schema:

    Nachname_Vorname_ID 

    dieser ensteht, da ich TXT Dateien nach bestimmten Suchbegriffen mittels RegEx durchsuche. Sollte ein Treffer vorkommen bildet mein Programm einen Listbox Eintag nach folgenden Code:

          If TrefferJaNein = True Then        ' Wenn Schleife NICHT vorzeitig beendet wurde
    
            'ListBox1.Items.Add(Datei)
    
            Dim Teil1 As String
    
            Teil1 = System.IO.Path.GetDirectoryName(Datei)
            ListBox1.Items.Add(".." & Datei.Substring(Teil1.Length))
            Label6.Text = ListBox1.Items.Count
    
            Application.DoEvents()
          End If
    

    Dies geschieht natürlich in einer Schleife für mehere tausend Textdateien. Wenn sämtliche Trefferdateien in der Listbox abgebildet sind kann ich per:

      Private Sub ListBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedValueChanged
        ListBox3.Visible = False
        ListBox3.Items.Clear()
        'dv = New DataView(dt)
        'If dv.RowFilter = "" Then
        DataGridView1.DataSource = dt
        'End If
        Auswahl()
      End Sub
    

    und

      Sub Auswahl()
        Dim Eintrag As String
        Dim Von, Bis As Integer
    
        Dim Zeilenwert As Integer
    
        Eintrag = ListBox1.SelectedItem
        Von = Eintrag.LastIndexOf("_") + 1
        Bis = Eintrag.LastIndexOf(".") <br/>
            ID = Eintrag.Substring(Von, Bis - Von)
    
    
        For Each Zeile As DataGridViewRow In DataGridView1.Rows
          If Zeile.Cells("ID").Value = ID Then
            Zeilenwert = Zeile.Index
            'DataGridView1.Rows(Zeilenwert).Selected = True
            DataGridView1.Rows(Zeilenwert).Selected = DataGridViewSelectionMode.FullRowSelect
            DataGridView1.FirstDisplayedScrollingRowIndex = Zeilenwert
    
            Exit For
          End If
        Next
      End Sub
    

    direkt im DataGridView in den passenden Datensatz welcher aus dem Listbox Eintrag extrahiert wird springen.

    Also der Datensatz: ..\Nachname_Vorname_ID wird zerlegt und die ID für die relvante Suche im DataGridView herangezogen.

    Dann wird die dementsprechende Zeile im DataGridView markiert. Jedoch ohne das dieser Zeile "der Pfeil" sprich der Datensatzmarker voransteht.

    Ich möchte also in der Listbox ein Eintrag auswählen, dieser soll dann im DataGridview angezeigt werden und gleichzeitig auf diesen Datensatz der Marker gesetzt werden.

    Sorry ist halt ein wenig schwierig zu beschreiben.

     

    LG Chris

    Dienstag, 19. Oktober 2010 11:18
  • Hallo nochmal,

    ich weiss nicht, warum diese Forensoftware heute glaubt,
    alles und jedes nach Gutdünken kaputtformatieren zu müssen,
    deshalb ein erneuter Versuch, mein Posting lesbar auf den
    Weg zu bringen.

    meine Listbox ist gefüllt mit Text nach dem Schema:

    Nachname_Vorname_ID

    dieser ensteht, da ich TXT Dateien nach bestimmten Suchbegriffen mittels
    RegEx durchsuche. Sollte ein Treffer vorkommen bildet mein Programm
    einen Listbox Eintag nach folgenden Code:

    [code]

         If TrefferJaNein = True Then        _
     ' Wenn Schleife NICHT vorzeitig beendet wurde

           'ListBox1.Items.Add(Datei)

           Dim Teil1 As String

           Teil1 = System.IO.Path.GetDirectoryName(Datei)
           ListBox1.Items.Add(".." & Datei.Substring(Teil1.Length))
           Label6.Text = ListBox1.Items.Count

           Application.DoEvents()

    Was soll dieses .DoEvents bewirken?

         End If

    Dies geschieht natürlich in einer Schleife für mehere tausend Textdateien.

    Und wie lange dauert es bis Du mehrere tausend Textdateien nach
    bestimmten Begriffen durchsucht hast?

    Wenn sämtliche Trefferdateien in der Listbox abgebildet sind kann ich per:

     Private Sub ListBox1_SelectedValueChanged _
             (ByVal sender As Object, _
              ByVal e As System.EventArgs _
             ) Handles ListBox1.SelectedValueChanged

         ListBox3.Visible = False
         ListBox3.Items.Clear()
         'dv = New DataView(dt)
         'If dv.RowFilter = "" Then
         DataGridView1.DataSource = dt

    Wie und wo dt deklariert, erstellt und mit welchen Daten gefüllt wird
    sehe ich bisher immer noch nicht.

         'End If
         Auswahl()
     End Sub

    und

     Sub Auswahl()
         Dim Eintrag As String
         Dim Von, Bis As Integer

         Dim Zeilenwert As Integer

         Eintrag = ListBox1.SelectedItem
         Von = Eintrag.LastIndexOf("_") + 1
          Bis = Eintrag.LastIndexOf(".") <br/>
          ID = Eintrag.Substring(Von, Bis - Von)

          For Each Zeile As DataGridViewRow In DataGridView1.Rows
              If Zeile.Cells("ID").Value = ID Then
                  Zeilenwert = Zeile.Index
                  'DataGridView1.Rows(Zeilenwert).Selected = True

                  DataGridView1.Rows(Zeilenwert).Selected = _
                          DataGridViewSelectionMode.FullRowSelect

                  DataGridView1.FirstDisplayedScrollingRowIndex = Zeilenwert

                  Exit For
              End If
          Next
     End Sub

    direkt im DataGridView in den passenden Datensatz welcher aus
    dem Listbox Eintrag extrahiert wird springen.

    Eine Zeile mit einer bestimmten ID im Datenbestand einer DataTable
    kann man deutlich einfacher und schneller mit BindingSource.Find()
    ermitteln.
    Voraussetzung dafür ist, dass man vorher die Spalte ID als
    Primärschlüssel definiert hat (s.Code im Beispiel unten).

    Also der Datensatz: ..\Nachname_Vorname_ID wird zerlegt und
    die ID für die relvante Suche im DataGridView herangezogen.

    Dann wird die dementsprechende Zeile im DataGridView markiert.
    Jedoch ohne das dieser Zeile "der Pfeil" sprich der Datensatzmarker
    voransteht.

    Ich möchte also in der Listbox ein Eintrag auswählen, dieser soll dann
    im DataGridview angezeigt werden und gleichzeitig auf diesen Datensatz
    der Marker gesetzt werden.

    Welcher "Marker" soll auf den Datensatz gesetzt werden?
    Im vorigen Satz hast Du gefordert, dass der "Pfeil" nicht auf
    diesem Datensatz stehen soll.
    Was denn nun?

    Sorry ist halt ein wenig schwierig zu beschreiben.

    Das ist meist ein Zeichen dafür, dass das gewählte Programmkonzept
    möglicherweise doch noch nicht so ganz gründlich durchdacht ist.

    Hier mal mein früheres Beispiel mit einer Erweiterung um eine ComboBox
    in welcher nach Auswahl eines bestimmten Eintrages die hierzu passende
    Zeile im DGV markiert wird, der Datensatzmarkierer (Pfeil) jedoch auf der
    bisher gewählten Zeile verbleibt.

    ' / / /  Code in Formmodul (Form1.vb)
    Public Class Form1
        Private WithEvents CBox As ComboBox
        Private mDT As DataTable
        Private WithEvents mBS As BindingSource

        Private mMonTable As DataTable

        Private WithEvents DGV As DataGridView
        Private WithEvents btnFirst As Button
        Private WithEvents btnPrevious As Button
        Private WithEvents btnNext As Button
        Private WithEvents btnLast As Button

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

            CreateControls()
            CreateData()
            DGV.DataSource = mBS

            With CBox
                .DataSource = mMonTable.DefaultView

                .DisplayMember = _
                        mMonTable.Columns(1).ColumnName

                .ValueMember = _
                        mMonTable.Columns(0).ColumnName
            End With
        End Sub

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

            DGV.Columns(0).DefaultCellStyle.Alignment = _
                    DataGridViewContentAlignment.MiddleRight

            DGV.AutoResizeColumns()
        End Sub

        Private Sub CreateData()
            Dim i As Integer
            Dim DR As DataRow

            mDT = New DataTable
            With mDT
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("LText", GetType(String))
                .Columns.Add("SText", GetType(String))

                ' Spalte 0 (ID) als Primärschlüsselspalte definieren
                .Constraints.Add("PKey", .Columns(0), True)

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i, False)
                    DR.Item(2) = MonthName(i, True)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With

            mBS = New BindingSource
            mBS.DataSource = mDT

            mMonTable = New DataTable
            With mMonTable
                .Columns.Add("ID", GetType(Integer))
                .Columns.Add("Text", GetType(String))

                For i = 1 To 12
                    DR = .NewRow
                    DR.Item(0) = i
                    DR.Item(1) = MonthName(i)
                    .Rows.Add(DR)
                Next
                .AcceptChanges()
            End With
        End Sub

        Private Sub CreateControls()

            CBox = New ComboBox
            With CBox
                .Name = "CBox"
                .Font = New Font("Arial", 14)

                .SetBounds _
                        (10, 10, _
                         Me.ClientSize.Width - 20, _
                         .Height)

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

                .DropDownStyle = _
                        ComboBoxStyle.DropDownList

            End With
            Me.Controls.Add(CBox)

            DGV = New DataGridView
            With DGV
                .Name = "DGV"
                .SetBounds _
                        (10, CBox.Bottom + 10, _
                         Me.ClientSize.Width - 20, _
                         Me.ClientSize.Height - _
                            (CBox.Bottom + 70))

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

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

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

            End With
            Me.Controls.Add(DGV)

            btnFirst = New Button
            With btnFirst
                .Name = "btnFirst"

                .SetBounds _
                        (10, DGV.Bottom + 10, _
                         40, 40)

                .Text = "|<"

                .Anchor = _
                        AnchorStyles.Left Or _
                        AnchorStyles.Bottom
            End With
            Me.Controls.Add(btnFirst)

            btnPrevious = New Button
            With btnPrevious
                .Name = "btnPrevious"

                .SetBounds _
                        (btnFirst.Right + 2, _
                         btnFirst.Top, _
                         40, 40)

                .Text = "<"

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

            End With
            Me.Controls.Add(btnPrevious)

            btnNext = New Button
            With btnNext
                .Name = "btnNext"

                .SetBounds _
                        (btnPrevious.Right + 2, _
                         btnFirst.Top, _
                         40, 40)

                .Text = ">"

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

            End With
            Me.Controls.Add(btnNext)

            btnLast = New Button
            With btnLast
                .Name = "btnLast"

                .SetBounds _
                        (btnNext.Right + 2, _
                         btnFirst.Top, _
                         40, 40)

                .Text = ">|"

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

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

        Private Sub NavButton_Click _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles _
                        btnFirst.Click, _
                        btnPrevious.Click, _
                        btnNext.Click, _
                        btnLast.Click

            Select Case True
                Case sender Is btnFirst
                    mBS.Position = 0

                Case sender Is btnPrevious
                    mBS.Position -= 1

                Case sender Is btnNext
                    mBS.Position += 1

                Case sender Is btnLast
                    mBS.Position = mBS.Count - 1

            End Select

        End Sub

        Private Sub mBS_PositionChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles mBS.PositionChanged

            Dim DRV As DataRowView = _
                    DirectCast(mBS.Current, DataRowView)

            ' Werte aus der DataRowView des akt.
            ' ausgewählten Datensatzes lesen:
            Me.Text = _
                    DRV.Item(0).ToString & "  " & _
                    DRV.Item(1).ToString & "  " & _
                    DRV.Item(2).ToString

        End Sub

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

            ' Werte aus DGV.CurrentRow.Cells(x) lesen:
            If DGV.CurrentRow IsNot Nothing Then
                Dim Buffer As String
                With DGV.CurrentRow
                    Buffer = _
                        (DGV.CurrentRow.Cells(0).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(1).Value.ToString & "  " & _
                         DGV.CurrentRow.Cells(2).Value.ToString)
                End With
                Console.WriteLine(Buffer)
            End If
        End Sub

        Private Sub CBox_SelectedIndexChanged _
                (ByVal sender As Object, _
                 ByVal e As System.EventArgs _
                ) Handles CBox.SelectedIndexChanged

            Dim ID As Integer
            Dim RowNum As Integer

            ID = _
                CInt _
                    (DirectCast _
                    (CBox.SelectedItem,  _
                    DataRowView).Item(0))

            ' Zeilennummer mit der gesuchten ID ermitteln
            RowNum = mBS.Find("ID", ID)

            If RowNum > -1 Then
                ' bisherige Zeilenmarkierungen zurücksetzen
                Do While DGV.SelectedRows.Count > 0
                    DGV.SelectedRows(0).Selected = False
                Loop
                ' Zeile mit RowNum markieren
                DGV.Rows(RowNum).Selected = True
                ' markierte Zeile in sichtbaren Bereich scrollen
                DGV.FirstDisplayedScrollingRowIndex = RowNum
            End If
        End Sub
    End Class
    ' \ \ \  E N T E

    Nach dem Programmstart siehst Du die Form1, diesmal mit einer
    ComboBox (CBox), einem DataGridView (DGV) und den vom
    vorigen Beispiel schon bekannten Navigationsbuttons.

    Mit jeder neuen Auswahl in der ComboBox wird der zur dieser
    Auswahl (ID) passende Datensatz im DGV markiert, der
    Datensatzmarkierer (Pfeil) bleibt auf dem bisher gewählten
    Datensatz.

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

    Dienstag, 19. Oktober 2010 16:56