PDA

Vollständige Version anzeigen : DatagridView, Selektierte Zeile


Jörg Diekmann
16.04.2008, 11:56
Hallo Leutz,

ich habe eine DataGridView über eine DataTable angebunden.
Jetzt möchte ich, dabei ist das dataGridView so konfiguriert das es lediglich gelesen werden kann (Read only), das wenn man auf einen RowHader mit der maus einen Doppelklick macht, der aktuell markierte datensatz in einem Anzeigedialog mit Textboxen angezeigt wird. Wie erreiche ich, das das Doppelklick-Ereignis feststellt welche Zeile markiert ist und dann die Daten in dem Anzeige (Detail)-Dialog anzeigt?

Um eine Antwort, am Besten mit exempl. Beispiel wäre ich dankbar.

Gruss aus Bochum
Jörg Diekmann

Robert_Zenz
16.04.2008, 15:37
Das ist mehr oder minder einfach (brauch ich ständig, von dem her für mich einfach ;) ).

ReadOnly kannst du einfach haben, einfach unter den Eigenschaften setzen.

Und das wäre der Code wenn du die Zeile auslesen willst:

Private Sub DeinDataGrid_RowHeaderMouseDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DeinDataGrid.RowHeaderMouseDoubleClick
'zwischenspeichern des Indexes der selektierten Reihe (hat bequemlichkeitsgründe)
Dim selRow As Integer = Me.DeinDataGrid.SelectedRows.Item(0).Index

'auslesen der gewollten Werte (anstatt dem Namen kann man auch den Index der Spalte verwenden)
Textbox1.Text = DeinDataGrid.Item("Name deiner Spalte", selRow).Value
Textbox2.Text = DeinDataGrid.Item("Name deiner 2. Spalte", selRow).Value
Textbox3.Text = DeinDataGrid.Item("Name deiner 3. Spalte", selRow).Value
...

End Sub


Rob

Jörg Diekmann
17.04.2008, 07:51
Hallo Robert,

Danke erstmal für die schnelle Antwort/Hilfestellung.
Ich hätte alllerdings noch eine Rückfrage:

Das DataGridView befindet sich in einem Formular auf einer Registerkarte.
Wenn nur dort das Ereignis RowHeaderMouseDoubleClick (wie von dir beschrieben) ausgelöst und darüber die Werte für die Textboxen ausgelesen werden, wie krieg ich die Werte nun in einen modalen Dialog übertragen? Die Textboxen befinden sich in dem gesonderten modalen Dialog und nicht auf demselben Formular, wie das DatagridView.

Vielleicht kannst du mir diesbezüglich noch mal helfen. Leider bin ich noch nicht in allen Dingen mit vb.net so fit, habe aber eine Aufgabe, zu der ich in den nächsten Tagen ein Ergebnis abliefern muss.

Danke im Voraus!

Gruss
Jörg

hcscherzer
17.04.2008, 08:16
Moin Jörg,

beim Öffnen des modalen Dialogs holst Du Dir einfach die Werte in der Form_Load() Prozedur.
Wenn Du auf das Formular mit dem DataGrid eine Objektvariable definiert hattest, kannst Du über diese von jedem anderen Objekt aus darauf zugreifen.
public mff1 as form1, mff2 as form2 ' globale Variablen für Formulare in einem Modul

'irgendwo wird das Form1 geöffnet ...
set mff1 = new form1
mff1.show()

' und irgendwo form2 ...
set mff2 = new form2
mff2.showdialog()

' und in dem Klassenmodul von Form2 (modal) kannst Du dann
private sub form2_load()
Textbox1.Text = mff1.DeinDataGrid.Item("Name deiner Spalte", selRow).Value
' die Werte holen ...
end sub

Jörg Diekmann
17.04.2008, 11:09
Hallo hc,

dein Vorschlag funzt leider nicht. der mod. Dialog kennt die Variable selRow nicht. Hiiiiilfe! Was mach ich falsch?

Robert_Zenz
17.04.2008, 11:58
Natürlich kennt er selRow nicht, ist ja schließlich eine lokale Variable. ;)

Da fehlt davor halt noch das Dim mit selRow, oder du übergibst es ihm.

Rob

Jörg Diekmann
17.04.2008, 12:58
Hallo Robert, hallo hc

danke erstmal für Eure Bemühungen,

@Robert:

ich habe versucht selRow zu deklarieren bzw. zu übergeben, klappt aber nicht; während der Laufzeit tritt dann eine NullReferenceException auf und teilt mit das ein objektverweis fehlt. Ich versteh das nicht, das ist mir jetzt zu hoch.

Wo muss ich selRow wie an den modalen Dialog übergeben? Was muss ich sonst noch übergeben an den modalen Dialog übergeben - die Values aus der DataGridView???

Ich liefere mal meinen Quelltext bei, vielleicht siehst du ja den Fehler und kannst mir Hinweise zur Lösung geben.

Hier also der Quelltext:

1. Das den Dialog aufrufende Formular :

Eine Ausgabe der Werte in eine Msg-Box funktioniert dort! (siehe auskommentierte Zeilen

Imports system.Data.OleDb
Public Class frmShowDepartment

Dim connStr As String = My.Settings.TBookConn
Dim conn As New OleDbConnection(connStr)

Private dv As DataView
Private dt As DataTable
Private drv As DataRowView

Public Sub New()

' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
InitializeComponent()

' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.

'Setzen des Formulartitels
Me.Text = "Abteilung/en anzeigen"

'Setzen der Karteireiterbezeichnungen
Me.XtraTabPage1.Text = "Selektion"
Me.XtraTabPage2.Text = "Selektionsergebnis"

End Sub

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)

ReadConnect()
MyBase.OnLoad(e)

End Sub

Private Sub ReadConnect()
Dim cmd As New OleDbCommand("Select txtDepartmentTitle, txtDeptDescription, fk_DeptLevel, fk_SuperiorDept, fk_CostCentre from Department", conn)
Dim da As New OleDbDataAdapter(cmd)

dt = New DataTable("Abteilungen")

conn.Open()

da.Fill(dt)

conn.Close()

dv = dt.DefaultView

Me.DataGridView1.DataSource = dv

'Setzen der Spaltenbeschriftungen im GridView
Me.DataGridView1.Columns("txtDepartmentTitle").HeaderText = "Abt. Bezeich."
Me.DataGridView1.Columns("txtDeptDescription").HeaderText = "Abt. Beschreib."
Me.DataGridView1.Columns("fk_DeptLevel").HeaderText = "Ebene"
Me.DataGridView1.Columns("fk_SuperiorDept").HeaderText = "Abt./Bereichs Zuord."
Me.DataGridView1.Columns("fk_CostCentre").HeaderText = "Kst."

'Setzen Spaltenbreiten im GridView
Me.DataGridView1.Columns(0).Width = 180
Me.DataGridView1.Columns(1).Width = 220
Me.DataGridView1.Columns(2).Width = 100
Me.DataGridView1.Columns(3).Width = 230
Me.DataGridView1.Columns(4).Width = 77

End Sub

Private Sub btn_Close_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Close.Click
Me.Close()
End Sub



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


Dim selRow As Integer = Me.DataGridView1.SelectedRows.Item(0).Index

dlg_1 = New dlgShowDeptDetails
dlg_1.ShowDialog()

'Dim Col_1 As String = DataGridView1.Item(0, selRow).Value
'Dim Col_2 As String = DataGridView1.Item(1, selRow).Value
'Dim Col_3 As String = DataGridView1.Item(2, selRow).Value
'Dim Col_4 As String = DataGridView1.Item(3, selRow).Value
'Dim Col_5 As String = DataGridView1.Item(4, selRow).Value

'MessageBox.Show(Col_1 & vbCrLf & Col_2 & vbCrLf & Col_3 & vbCrLf & Col_4 & vbCrLf & Col_5)

End Sub


End Class

Nun der Code des Dialog-Formulars:

Imports System.Windows.Forms

Public Class dlgShowDeptDetails

Private Sub OK_Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK_Button.Click

Me.Close()

End Sub

Private Sub dlgShowDeptDetails_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim selRow As Integer

Me.txtDeptTitle.Text = frm_20.DataGridView1.Item("txtDeptTitle", selRow).ToString

End Sub
End Class

Ich hoffe Du oder hc oder jemand anderes kann mir helfen

Danke im Voraus und Gruss
Jörg

Robert_Zenz
17.04.2008, 13:06
Ersetz mal deine Dim selRow durch:


Dim selRow As Integer = frm_20.DataGridView1.SelectedRows.Item(0).Index


Dann sollte es auch damit klappen. ;)

Rob

P.s.: Ich hab mir jetzt nicht den ganzen Quellcode angeschaut, ist also nur geraten. ^^'

Jörg Diekmann
17.04.2008, 13:10
Hallo Robert,

das hatte ich vorher schon probiert , das war s leider nicht. Sorry.

Gruss
Jörg

hcscherzer
17.04.2008, 14:57
Könnte es sein, dass die Eigenschaft SelectedRows.Item(0).Index nur zur Verfügung steht, wenn das Control den Fokus hat?
Wenn ein modales Formular davor liegt, hat ja das andere sicher nicht mehr den Fokus. Was kannst Du tun? Vielleicht selRow global deklarieren, damit es nach der Auswahl auch im zweiten Form zur Verfügung steht?