DataGridView => DataTable-Spaltenname

19/02/2008 - 00:26 von Michael Vollmer | Report spam
Hallo NG,

ich habe ein DataGridView (DGV), welches eine DataTable
als gebundenes Datenelement hat.

Eine der Spaltenüberschriften im DGV heißt zum Bsp.
"Bezeichnung". Die datengebundene Spalte des DataTables
dazu heißt "description".
Zur Laufzeit bekomme ich den Namen der DGV Spalte
geliefert: "Bezeichnung"

wenn ich versuche auf:
myDGV.Columns("Bezeichnung") zugreife,
dann erhalte ich einen Fehler, weil dort der Name
der gebundenen Datenquelle ("description") als
String-Bezeichner erwartet wird

kann man den an ein DGV datengebunden Spaltennamen einer DataTable
mit einem Befehl ermitteln, ohne die Columns-Auflistung
des DataGridViews zu durchlaufen?

Gruß
Micha
 

Lesen sie die antworten

#1 Peter Götz
19/02/2008 - 09:41 | Warnen spam
Hallo Michael,

ich habe ein DataGridView (DGV), welches eine
DataTable als gebundenes Datenelement hat.



Tatsàchlich ist Dein DGV an ein DataView-Objekt
gebunden, welches, wenn Du es nicht explizit erzeugt
und als DGV.DataSource zugewiesen hast, implizit
erzeugt wird.


Eine der Spaltenüberschriften im DGV heißt zum Bsp.
"Bezeichnung".



Wie (Code) ist die dort hingekommen?
Eine Spaltenüberschrift kann autom. aus der DataSource
übernommen werden, kann aber auch per Programmcode
abweichend vom HeaderText der DataSource gebildet
werden.

Die datengebundene Spalte des DataTables
dazu heißt "description".
Zur Laufzeit bekomme ich den Namen der DGV Spalte
geliefert: "Bezeichnung"



Wenn Du einfach schreibst,

DGV.DataSource = DeineDataTable

dann sicher nicht. Irgendwo in Deinem Code musst
Du eine von DeineDataTable.Columns(x).ColumnName
abweichende Spaltenbezeichnung erzeugen.


wenn ich versuche auf:
myDGV.Columns("Bezeichnung") zugreife,



Zeige mal die vollst. Codezeile.

dann erhalte ich einen Fehler, weil dort der Name
der gebundenen Datenquelle ("description") als
String-Bezeichner erwartet wird

kann man den an ein DGV datengebunden
Spaltennamen einer DataTable mit einem Befehl
ermitteln, ohne die Columns-Auflistung
des DataGridViews zu durchlaufen?



Offenbar sind Dir die Zusammenhànge zwischen
DataGridView, DataView mit DataRowView und
DataTable mit DataRow nicht so ganz klar.
Schau Dir mal das nachfolgende Beispiel an.
In der Sub DGV_CellEnter() siehst Du diese
Zusammenhànge.

' /// Code in einer leeren Form1
Imports System.Text
Public Class Form1
Private WithEvents DGV As DataGridView
Private WithEvents mCM As CurrencyManager
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

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

.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)

CreateData()
With DGV
.DataSource = mDV
.Columns(1).HeaderText = "Bezeichnung"

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

.AutoResizeColumns()
End With
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("Description", GetType(String))

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

mDV = New DataView(mDT)

mCM = DirectCast _
(Me.BindingContext(mDV), CurrencyManager)
End Sub

Private Sub DGV_CellEnter _
(ByVal sender As Object, _
ByVal e As DataGridViewCellEventArgs _
) Handles DGV.CellEnter

If mCM.Position > -1 Then
Dim strBuffer As String = ""
Dim SB As New StringBuilder

' akt. Zeile im DataGridView
Dim DGVR As DataGridViewRow = _
DGV.Rows(e.RowIndex)

' akt Zeile in der DataView (mDV)
Dim DRV As DataRowView = _
mDV.Item(e.RowIndex)

' akt. Zeile in der DataTable (mDT)
Dim DR As DataRow = DRV.Row

' Spaltenname der akt. Spalte im DGV
SB.AppendLine _
("DGV.Columns(" & e.ColumnIndex.ToString & _
").Name: " & DGV.Columns(e.ColumnIndex).Name)

' HeaderText der akt. Spalte im DGV
SB.AppendLine _
("DGV.Columns(" & e.ColumnIndex.ToString & _
").HeaderText: " & _
DGV.Columns(e.ColumnIndex).HeaderText)

' ColumnName der akt. Spalte in der DataTable
SB.AppendLine _
("mDT.Columns(" & e.ColumnIndex.ToString _
& ").ColumnName: " & _
mDT.Columns(e.ColumnIndex).ColumnName)


' Inhalt der akt. DataGridviewRow
strBuffer = "DataGridViewRow (DGVR): " & _
DGVR.Cells(0).Value.ToString & _
"; " & _
DGVR.Cells(1).Value.ToString
SB.AppendLine(strBuffer)

' Inhalt der akt. Zeile der DataView (mDV)
strBuffer = "DataRowView (DRV): " & _
DRV.Item(0).ToString & _
"; " & _
DRV.Item(1).ToString
SB.AppendLine(strBuffer)

' Inhalt der akt Zeile der DataTable (mDT)
strBuffer = "DataRow (DR): " & _
DR.Item(0).ToString & _
"; " & _
DR.Item(1).ToString
SB.AppendLine(strBuffer)

Console.WriteLine _
(SB.ToString & ControlChars.CrLf)
End If
End Sub
End Class
' \\\ E N T E

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

Ähnliche fragen