vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Datagridview Currentcell und Select 
Autor: Vaubehnet
Datum: 25.06.18 11:18

Hallo zusammen,

ich habe ein Datagridview (dgvKanon), bei dem ich per Klick eine Zeile auswähle.
Der Inhalt der Zeile wird dann in Textboxen unterhalb des Datagridviews angezeigt.

Ein Button startet dann eine Aktion mit dem ausgewählten Datensatz. Danach wird das Datagrid neu eingelesen und der Cursor soll wieder an die entsprechende Stelle springen.
Mit den folgenden beiden Codeschnipseln kann ich eine Zeile "merken" und nach der Manipulation wieder an die entsprechende Stelle im Datagridview springen.

 'Datagridview Position auslesen
        Dim intRow As Integer = dgvKanon.CurrentCell.RowIndex
        Dim intColumn As Integer = dgvKanon.CurrentCell.ColumnIndex
'Datagridview Position setzen
        intRow = intRow - 1
        If intRow > 0 Then
            dgvKanon.CurrentCell = dgvKanon(intColumn, intRow)
 
'Das hier scheint nicht auszureichen:
            dgvKanon.CurrentCell.Selected = True
        Else
            dgvKanon.CurrentCell = dgvKanon(intColumn, 0)
        End If
Aber was mir fehlt, ist ein "Klick" in eine Zelle des Datagridviews, damit der so selektierte Datensatz auch wieder in meinen Texboxen erscheint.
Das oben eingefügte "dgvKanon.Currentcell.selected = true" scheint nicht auszureichen.
Erst wenn ich noch einmal mit der Maus in die Zeile klicke, erscheint der Inhalt wieder in den Textboxen.

Was habe ich übersehen?

Danke u. Gruß

vaubehnet

---
Verwendete Programmversionen:
Windows 7 64 bit sowie Windows 10 Prof.
Visual Studio 13 Professional
Microsoft Prof. 2010 (= Version 14)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: effeff
Datum: 25.06.18 13:41

Setz noch ein

dgvKanon.BeginEdit(True)
dahinter...

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Vaubehnet
Datum: 25.06.18 14:28

Hallo effeff,

danke für die schnelle Antwort. Aber leider ist der Effekt derselbe.
Ich muss erst in eine Zelle klicken, bevor die Textboxen aktualisiert werden.

Der Code (mit Deiner Zeile):
'Datagridview Position setzen
        intRow = intRow - 1
        If intRow > 0 Then
            dgvKanon.CurrentCell = dgvKanon(intColumn, intRow)
            dgvKanon.CurrentCell.Selected = True
        Else
            dgvKanon.CurrentCell = dgvKanon(intColumn, 0)
            dgvKanon.CurrentCell.Selected = True
        End If
 
        dgvKanon.BeginEdit(True)
Anscheinend muss ich dem Programm beibringen, nach der Routine oben noch ein
"Cellclick" zu übergeben

Private Sub dgvKanon_CellClick(sender As Object, e As _
  DataGridViewCellEventArgs) Handles dgvKanon.CellClick
Versucht habe ich:

dgvKanon_CellClick(dgvKanon, e)
... aber das scheitert natürlich.

Noch eine Idee?

Danke u. Gruß

vaubehnet

---
Verwendete Programmversionen:
Windows 7 64 bit sowie Windows 10 Prof.
Visual Studio 13 Professional
Microsoft Prof. 2010 (= Version 14)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Manfred X
Datum: 25.06.18 15:40

Hallo!

[I]Ein Button startet dann eine Aktion mit dem ausgewählten Datensatz.
Danach wird das Datagrid neu eingelesen und der Cursor soll wieder an
die entsprechende Stelle springen.[/I]

Mal prinzipiell:
Ein Datensatz kann nicht durch einen Control-Zeilenindex sicher
identifiziert werden.

Du mußt (insbesondere bei einem "Rebind" des Control) zunächst den
oder die Schlüsselwerte des Satzes speichern und die Zeile nach dem
"Einlesen" per Schlüssel suchen.

Bei Nutzung einer gemeinsamen Bindingsource (Grid und Textbox)
aktualisieren sich die Controls - evt. muß noch ein Reset der
Bindingsource erfolgen.

Beitrag wurde zuletzt am 25.06.18 um 15:41:21 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Vaubehnet
Datum: 27.06.18 08:07

Hallo Manfred!

Manfred X schrieb:
Zitat:


Mal prinzipiell:
Ein Datensatz kann nicht durch einen Control-Zeilenindex sicher
identifiziert werden.


Stimme zu. Aber in diesem besondren Fall geht es mir tatsächlich um die Position im Datagrid, nicht um den Datensatz.

Zum Hintergrund (falls ich einen Denkfehler habe und klarer will, warum die Position wichtig ist):
Meine Anwendung (Grundlage für eine kleine Studie) listet Wörter und deren Häufigkeiten. Diese werden in einer Tabelle dargestellt. Da die eingelesenen Datenquellen auch schon mal Unsinn enthalten, ist eine manuelle Nacharbeit notwendig - oft an Datensätzen die direkt aufeinander folgen.
Das Datagrid listet die Worte auf. Wenn ich nun ein Wort markiere und es lösche, wird die Liste neu eingelesen. Das gelöschte Wort (und damit der Datensatz) ist jetzt nicht mehr vorhanden.
Das Aktualisieren und "Neuanbinden" funktioniert.
Der Index des gelöschten Wortes im aktualisierten Datagrid zeigt nun auf den NÄCHSTEN Datensatz - so ist es gewollt. Und bis hier funktioniert auch mein Code.

Damit ich damit aber etwas anfangen kann, reicht das oben beschriebene Select nicht aus und auch die Methode von "effeff" hat leider nicht den gewünschten Effekt, da erst mit einem zusätzlichen "Klick" auf den bereits ausgewählten Datensatz die Textboxen unter dem Datagrid befüllt werden.

Mir fehlt also "der Klick" auf den Datensatz oder eine vergleichbare Aktion, damit meine Textfelder ihn anzeigen.

Gruß

vaubehnet

---
Verwendete Programmversionen:
Windows 7 64 bit sowie Windows 10 Prof.
Visual Studio 13 Professional
Microsoft Prof. 2010 (= Version 14)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Manfred X
Datum: 27.06.18 09:25

Hallo!

Ich verstehe das nicht.
Wieso muß nach dem Löschen von Datensätzen eine neues
Lesen der Liste erfolgen? Welche externe Datenquelle nutzt Du?

Nach dem neuen Lesen zeigt der vorab zwischengespeicherte
Grid-Zeilenindex nicht unbedingt auf einen wohl-definierten
"nächsten" Datensatz.

Was spricht eigentlich dagegen, statt dessen den Primärschlüssel
der "nächsten" Zeile zu speichern und nach der Aktualisierung der
Liste und dem Einlesen danach zu suchen und im Grid den Satz zu
selektieren? Das ist der vorgesehene und zuverlässige Weg.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Vaubehnet
Datum: 27.06.18 10:21

Hallo Manfred,

Manfred X schrieb:
Zitat:


Ich verstehe das nicht.
Wieso muß nach dem Löschen von Datensätzen eine neues
Lesen der Liste erfolgen? Welche externe Datenquelle nutzt Du?


Die externe Datenquelle ist eine Access-DB. Da das Projekt nur auf einem PC läuft (hier geht de PC zu den "Kunden" und nicht umgekehrt), ist kein Netzwerkzugriff und kein Multiuserzugriff erforderlich.
Das Neueinlesen der Liste erfolgt, damit der gelöschte (oder anderweitig geänderte DS - es gibt z.B. auch die Funktion "ignorieren") Datensatz aus der Auflistung verschwindet.


Zitat:

Nach dem neuen Lesen zeigt der vorab zwischengespeicherte
Grid-Zeilenindex nicht unbedingt auf einen wohl-definierten
"nächsten"; Datensatz.


Vielleicht habe ich etwas übersehen - aber wenn die zugrundeliegende Abfrage (SELECT... ORDER BY) für das Grid doch dieselbe ist, müsste der Grid-Zeilenindex doch auf den nächsten Datensatz zeigen?
Es fällt ja nur ein Datensatz heraus, die anderen rücken "auf".
Mir fällt kein Szenario ein, bei dem das nicht der Fall sein sollte.


Zitat:

Was spricht eigentlich dagegen, statt dessen den
Primärschlüssel
der "nächsten"; Zeile zu speichern und nach der
Aktualisierung der
Liste und dem Einlesen danach zu suchen und im Grid den Satz
zu
selektieren? Das ist der vorgesehene und zuverlässige
Weg.


Danke - daran habe ich noch nicht gedacht und werde ich in jedem Fall versuchen. Den entsprechenden DS finde ich dann vermutlich, indem ich die eine Schleife durch die Datatable laufen lasse - oder geht das eleganter?
Abzufangen dürfte dann der Sonderfälle sein, wenn der LETZTE DS gelöscht wird und es keine "nächste" Zeile gibt.

Leider besteht das Kernproblem: "Klick zur Auswahl des dann gefundenen DS" nach wie vor.

Gruß

vaubehnet

---
Verwendete Programmversionen:
Windows 7 64 bit sowie Windows 10 Prof.
Visual Studio 13 Professional
Microsoft Prof. 2010 (= Version 14)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Manfred X
Datum: 27.06.18 10:45

Hallo!

Wenn Du Sätze im Grid löscht und dann ein DB-Update der
geladenen Tabelle erfolgreich durchführst, sind Grid-Tabelle und
Datenbank-Tabelle dadurch "synchronisiert". Ein neues Laden
ist meines Erachtens nicht erforderlich.

Die Abfolge der Datensätze in einer DB-Tabelle ist nicht definiert.
Insbesondere nach dem Löschen von Sätzen könnte es zu einer "internen
Reorganisation" der DB-Tabelle kommen. Das Verhalten von Access kann
ich in diesm Zusammenhang nicht beurteilen (Komprimierungsfunktion).

Nach einem Löschen/Ändern der Sätze kann "ORDER BY" keine "wohldefinierte"
Abfolge herbeiführen (Mehrfacheinträge, Neuanordnung wg. geänderter Zelinhalte).
Du bewegst Dich mit Deinem Vorgehen auf sehr dünnem Eis!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Vaubehnet
Datum: 27.06.18 11:17

Manfred X schrieb:
Zitat:

Du bewegst Dich mit Deinem Vorgehen auf sehr dünnem
Eis!


Hallo Manfred,

werde mich sofort auf den Bauch legen und Richtung Ufer krabbeln

Danke für Deine Hinweise! Ich werde beim Zugriff auf den Index verzichten und auf die ID umstellen - Du hast mich überzeugt.
Aber wie bekomme ich die Anzeige des selectierten Datensatzes hin?
Der von effeff vorgeschlagene Code bringt leider nicht das gewünschte Ergebnis.
dgvKanon.BeginEdit(True)
Vorschläge?

Danke u. Gruß

vaubehnet

---
Verwendete Programmversionen:
Windows 7 64 bit sowie Windows 10 Prof.
Visual Studio 13 Professional
Microsoft Prof. 2010 (= Version 14)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Manfred X
Datum: 27.06.18 15:50

Hallo!

Falls Du unbedingt neu laden mußt,
hier ein Beispiel zum Speichern der Schlüsselwerte des
aktuellen Satzes und zum Finden des entsprechenden Satzes
in der Datenquelle (Datatable), z.B. nach dem Neuladen.
Public Class frmFindRow
 
    Dim dt As New DataTable
    Dim bs As New BindingSource
 
    Dim dgv As New DataGridView With
        {.Parent = Me, .DataSource = bs, 
        .Size = New Drawing.Size(500, 400),
        .AllowUserToAddRows = False}
 
    Dim WithEvents btnSetRow As New Button With
        {.Parent = Me, .Text = "Notiere Satz", 
         .Top = 410, .Width = 150}
 
    Dim WithEvents btnFindRow As New Button With
        {.Parent = Me, .Text = "Markiere Satz", 
         .Top = 410, .Width = 150, .Left = 160}
 
    'Klasse, um Schlüsselwerte zu speichern
    Private Class RowKey
        Public Name As String = ""
        Public Vorname As String = ""
        Public Ort As String = ""
        Public Strasse As String = ""
        Public Nummer As Integer
    End Class
 
    'Für die Schlüsselwerte des zuletzt notierten Satzes
    Dim CurrentRowkey As RowKey = New RowKey
 
 
    Private Sub frmFindRow_Load(sender As Object, 
                    e As EventArgs) Handles MyBase.Load
 
        Me.Size = New Size(520, 480)
 
        'Testdaten erstellen
        With dt
            With .Columns
                .Add("Name", GetType(String))
                .Add("Vorname", GetType(String))
                .Add("Ort", GetType(String))
                .Add("Strasse", GetType(String))
                .Add("Nummer", GetType(String))
            End With
 
            .PrimaryKey = 
           {.Columns(0), .Columns(1), .Columns(2), .Columns(3), .Columns(4)}
 
            With .Rows
                .Add("Albert", "Wolfgang", "Brüssel", "xyz", 12)
                .Add("Alberti", "Dieter", "München", "xyz", 22)
                .Add("Meyer", "Dieter", "München", "xyz", 22)
                .Add("Albert", "Magnus", "München", "abc", 44)
                .Add("Albert", "Wolfgang", "Brüssel", "xyz", 32)
                .Add("Alberti", "Dieter", "München", "xyz", 52)
                .Add("Meyer", "Dieter", "München", "xyz", 21)
                .Add("Albert", "Magnus", "München", "abc", 45)
            End With
        End With
 
        'Datenbindung 
        bs.DataSource = dt
    End Sub
 
 
    Private Sub btnSetRow_Click(sender As Object, 
                      e As EventArgs) Handles btnSetRow.Click
 
 
        'Aktuelle Zeile: Schlüsselwerte notieren
        Dim cr As DataGridViewRow = dgv.CurrentRow
        With CurrentRowkey
            .Name = cr.Cells("Name").Value.ToString
            .Vorname = cr.Cells("Vorname").Value.ToString
            .Ort = cr.Cells("Ort").Value.ToString
            .Strasse = cr.Cells("Strasse").Value.ToString
            .Nummer = CInt(cr.Cells("Nummer").Value)
        End With
    End Sub
 
 
    Private Sub btnFindRow_Click(sender As Object, 
                e As EventArgs) Handles btnFindRow.Click
 
        'Zeile in der Datenquelle suchen
        Dim dr As DataRow
        With CurrentRowkey
            dr = dt.Rows.Find 
              ({ .Name, .Vorname, .Ort, .Strasse, .Nummer})
        End With
        If dr Is Nothing Then
            MsgBox("Schlüssel nicht gefunden")
            Exit Sub
        End If
 
        'Zeilenposition im der Bindingsource ermitteln
        Dim index As Integer = -1
        Dim found As Boolean
        Do
            index += 1
            found = DirectCast(bs(index), DataRowView).Row.Equals(dr)
        Loop While Not found And index < bs.Count - 1
 
        If found Then bs.Position =index
    End Sub
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datagridview Currentcell und Select 
Autor: Vaubehnet
Datum: 29.06.18 10:57

Hallo Manfred,

ich habe etwas gebraucht, um mich durch den Code zu arbeiten und alles zu verstehen. Jetzt habe ich es

Vielen Dank - für mich ist das auch ein gutes Lehrbeispiel, wie so ein Thema angegangen wird - und wie guter Code aussieht.

Beste Grüße

vaubehnet

---
Verwendete Programmversionen:
Windows 7 64 bit sowie Windows 10 Prof.
Visual Studio 13 Professional
Microsoft Prof. 2010 (= Version 14)

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel