Forums Neueste Beiträge
 

auf DataGridView auf einer Form zugreifen

26/02/2008 - 17:46 von Hartmut Callies | Report spam
Hallo,
ich habe ein DataGridView auf einer Form frmTest. Wenn
ein DataView auf eine DataTable erstelle und das DataView
an das DataGridView binde, dann werden mir alle
Datensàtze anzeigt, wenn der Code in der Form
frmTest abgelegt ist.

DataGridView.DataSource = DataView

Wenn ich aber das DataGridView auf der Form frmTest
belasse und das DataView in der Klasse clsTest erzeuge
und von dort aus auf das DataGridView auf der Form frmTest
verweise, bleibt das DataGridView "schwarz", d.h. keine
Spalten und keine Datensàtze. Warum?

frmTest.DataGridView.DataSource = DataView

Eine TextBox auf der gleichen Form, kann ich von clsTest
aus auslesen.

Hartmut Callies
 

Lesen sie die antworten

#1 Peter Götz
26/02/2008 - 20:12 | Warnen spam
Hallo Hartmut,

ich habe ein DataGridView auf einer Form frmTest.
Wenn ein DataView auf eine DataTable erstelle
und das DataView an das DataGridView binde,
dann werden mir alle Datensàtze anzeigt, wenn
der Code in der Form frmTest abgelegt ist.



Ja, sofern Du nicht irgendeinen Filter auf Deine
DataView gesetzt hast.

DataGridView.DataSource = DataView

Wenn ich aber das DataGridView auf der Form
frmTest belasse und das DataView in der Klasse
clsTest erzeuge und von dort aus auf das
DataGridView auf der Form frmTest verweise,
bleibt das DataGridView "schwarz", d.h. keine
Spalten und keine Datensàtze. Warum?

frmTest.DataGridView.DataSource = DataView
Eine TextBox auf der gleichen Form, kann ich von
clsTest aus auslesen.



Du kannst Deinem Klassenmodul schon einen Verweis
auf Dein DataGridView übergeben. Das könnte dann z.B.
so aussehen:

' /// Code in Form1
Public Class Form1
Private WithEvents DGV As New DataGridView
Private mDClass As DataClass

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

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

.Name = "DGV"
End With
Me.Controls.Add(DGV)

mDClass = New DataClass(DGV)
End Sub
End Class
' \\\ Form1 E N T E

' /// Code in DataClass.vb
Public Class DataClass
Private mDT As DataTable
Private mDV As DataView
Private mDGView As DataGridView

Public Sub New(ByVal DGView As DataGridView)
CreateData()

DGView.DataSource = mDV
End Sub


Public ReadOnly Property DT() As DataTable
Get
Return mDT
End Get
End Property

Public ReadOnly Property DV() As DataView
Get
Return mDV
End Get
End Property

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", 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

mDV = New DataView(mDT)
End Sub
End Class
' \\\ DataClass E N T E

Ich verstehe aber nicht so recht, warum Du der Klasse
einen Verweis auf das DGV übergeben und die Klasse
damit von Deiner Form1 abhàngig machen willst.
Statt die Klasse von der Form1 abhàngig zu machen
könntest Du besser Deiner Klasse eine Property, welche
ein DataView-Objekt liefert spendieren, und im Code
der Form1 oder wo sonst auch immer, auf diese
Property zugreifen. Das würde dann in etwa so aussehen:


' /// Code in Form1
Public Class Form1
Private WithEvents DGV As New DataGridView
Private mDClass As DataClass
Private WithEvents mCM As CurrencyManager

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

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

.Name = "DGV"
End With
Me.Controls.Add(DGV)

mDClass = New DataClass()

mCM = DirectCast _
(Me.BindingContext(mDClass.DV), _
CurrencyManager)

DGV.DataSource = mDClass.DV
DGV.AutoResizeColumns()
End Sub

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

Dim DRV As DataRowView
DRV = DirectCast(mCM.Current, DataRowView)
Me.Text = DRV.Item(0).ToString & ": " & _
DRV.Item(1).ToString & "; " & _
DRV.Item(2).ToString
End Sub
End Class
' \\\ Form1 E N T E

' /// Code in DataClass.vb
Public Class DataClass
Private mDT As DataTable
Private mDV As DataView

Public Sub New()
CreateData()
End Sub


Public ReadOnly Property DT() As DataTable
Get
Return mDT
End Get
End Property

Public ReadOnly Property DV() As DataView
Get
Return mDV
End Get
End Property

Private Sub CreateData()
Dim i As Integer
Dim DR As DataRow
mDT = New DataTable
With mDT
.Columns.Add("ID", GetType(Integer))
.Columns.Add("Text", 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

mDV = New DataView(mDT)
End Sub
End Class
' \\\ DataClass E N T E

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

Ähnliche fragen