| |
VB.NET - Ein- und UmsteigerDatagridview 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) | |
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) | |
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. | |
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. | |
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! | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|