Bei Drag&Drop Datagridviewquelle identifizieren

13/01/2009 - 12:26 von Norbert | Report spam
Hallo NG,

habe hier ein kleines Problem. Könnte mir bitte evt. jemand von Euch da
weiterhelfen?

Geht um Drag&Drop von Zeilen von mehreren Datagridviews auf ein gemeinsames
Datagridview.
Es gibt ein Haupt-Datagridview (DGMAIN) als alleiniges Drop-Ziel und mehrere
Datagridviews (DG1, DG2 usw.) als Drag-Quellen.

Das Drag&Drop separat zwischen z.Bsp. DG1 und DGMAIN funktioniert

Sub DG1_MouseDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles DG1.MouseDown
.
DG1.DoDragDrop(DG1.Rows(row), DragDropEffects.Copy)
.
End Sub

Private Sub DGMAIN_DragDrop(ByVal sender As Object, ByVal e As
System.Windows.Forms.DragEventArgs) Handles DGMAIN.DragDrop
Dim clientPoint As Point = Me.DGMAIN.PointToClient(New Point(e.X,
e.Y))
Dim hit As DataGridView.HitTestInfo = Me.DGMAIN.HitTest(clientPoint.X,
clientPoint.Y)
Dim myType As Type = GetType(DataGridViewRow)

Dim r As DataGridViewRow = DG1.Rows(e.Data.GetData(myType).Index)
.

End sub

Man (Ich) muss aber bei <Dim r As DataGridViewRow =
DG1.Rows(e.Data.GetData(myType).Index)> explizit die Dragquelle DG1 mit
angeben.
Wie kann man also im DragDrop-Event des Zierlgrids die Quelle
identifizieren? Geht das nur über eine globale Var, der man beim MouseDown
die Quelle übergibt (Krux)?

Danke schon mal für jeden Tipp.

Viele Grüße
Norbert
(nschiller@freenet.de)
 

Lesen sie die antworten

#1 Peter Götz
14/01/2009 - 17:14 | Warnen spam
Hallo Norbert,

Geht um Drag&Drop von Zeilen von mehreren Datagridviews
auf ein gemeinsames Datagridview.
Es gibt ein Haupt-Datagridview (DGMAIN) als alleiniges
Drop-Ziel und mehrere Datagridviews (DG1, DG2 usw.)
als Drag-Quellen.



Je nach Datenquelle Deiner Grids gibt es da ganz
unterschiedliche Möglichkeiten.

Hier mal ein Beispiel in dem man beliebige Zeilen
(nur 1 oder auch mehrere markierte Zeilen) von einem
DataGridView zu einem anderen verschieben kann.
Datenquelle für diese Grids ist im Beispiel eine
ListOf(Object).

' /// Code in einem leeren Formmodul (Form1)
Public Class Form1
Private WithEvents DGV1 As DataGridView
Private WithEvents DGV2 As DataGridView
Private WithEvents mCM1 As CurrencyManager
Private WithEvents mCM2 As CurrencyManager

Private WithEvents mMList1 As List(Of clsMonth)
Private WithEvents mMList2 As List(Of clsMonth)

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

DGV1 = New DataGridView
DGV2 = New DataGridView

With DGV1
.DefaultCellStyle.Font = _
New Font("Arial", 10)

.ColumnHeadersDefaultCellStyle.Font = _
New Font("Arial", 8, FontStyle.Bold)
.Name = "DGV1"
End With

With DGV2
.DefaultCellStyle.Font = _
DGV1.DefaultCellStyle.Font

.ColumnHeadersDefaultCellStyle.Font = _
DGV1.ColumnHeadersDefaultCellStyle.Font
.Name = "DGV2"
End With
Form1_Resize(Me, New System.EventArgs)

Me.Controls.Add(DGV1)
Me.Controls.Add(DGV2)

CreateData()
DGV1.DataSource = mMList1
DGV1.AutoResizeColumns()

DGV2.DataSource = mMList2

End Sub

Private Sub Form1_Resize _
(ByVal sender As Object, _
ByVal e As System.EventArgs _
) Handles Me.Resize

DGV1.SetBounds _
(10, 10, _
Me.ClientSize.Width - 20, _
Me.ClientSize.Height \ 2 - 15)

DGV2.SetBounds _
(10, _
DGV1.Bottom + 10, _
DGV1.Width, _
DGV1.Height)
End Sub

Private Sub CreateData()
Dim i As Integer
mMList1 = New List(Of clsMonth)
mMList2 = New List(Of clsMonth)

For i = 1 To 12
mMList1.Add(New clsMonth(i))
Next

mCM1 = _
DirectCast _
(DGV1.BindingContext(mMList1), _
CurrencyManager)

mCM2 = _
DirectCast _
(DGV2.BindingContext(mMList2), _
CurrencyManager)
End Sub

Private Sub DGV_MouseDown _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.MouseEventArgs _
) Handles DGV1.MouseDown, DGV2.MouseDown

Dim DGVsource As DataGridView = _
DirectCast(sender, DataGridView)

Dim DGVdest As DataGridView

If DGVsource Is DGV1 Then
DGVdest = DGV2
Else
DGVdest = DGV1
End If

Dim i As Integer = _
DGVsource.HitTest(e.X, e.Y).RowIndex

If i > -1 Then
Dim MList As New List(Of clsMonth)
Dim M As clsMonth

If DGVsource.SelectedRows.Count < 1 Then
M = _
DirectCast _
(DGVsource.Rows(i).DataBoundItem, _
clsMonth)

MList.Add(M)

Else

Dim DGVR As DataGridViewRow
For Each DGVR In DGVsource.SelectedRows

MList.Add _
(DirectCast(DGVR.DataBoundItem, clsMonth))

Next
End If

DGVdest.AllowDrop = True
DGVdest.DoDragDrop(MList, DragDropEffects.All)
End If
End Sub


Private Sub DGV_DragEnter _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs _
) Handles DGV1.DragEnter, DGV2.DragEnter

If e.Data.GetDataPresent _
(GetType(List(Of clsMonth))) Then

e.Effect = DragDropEffects.Move
End If
End Sub


Private Sub DGV_DragDrop _
(ByVal sender As Object, _
ByVal e As System.Windows.Forms.DragEventArgs _
) Handles DGV1.DragDrop, DGV2.DragDrop

Dim MList As List(Of clsMonth)
Dim M As clsMonth

Dim DGVsource As DataGridView
Dim DGVdest As DataGridView
Dim mListSource As List(Of clsMonth)
Dim mListDest As List(Of clsMonth)

DGV1.DataSource = Nothing
DGV2.DataSource = Nothing
mCM1.SuspendBinding()
mCM2.SuspendBinding()

DGVdest = DirectCast(sender, DataGridView)
If DGVdest Is DGV2 Then
DGVsource = DGV1
mListSource = mMList1
mListDest = mMList2
Else
DGVsource = DGV2
mListSource = mMList2
mListDest = mMList1
End If

DGVdest.AllowDrop = False

MList = DirectCast(e.Data.GetData _
(GetType(List(Of clsMonth))), _
List(Of clsMonth))

For Each M In MList
mListSource.Remove(M)
mListDest.Add(M)
Next

DGV1.DataSource = mMList1
DGV2.DataSource = mMList2
mCM1.ResumeBinding()
mCM2.ResumeBinding()

DGV1.AutoResizeColumns()
DGV2.AutoResizeColumns()
DGV1.Invalidate()
DGV2.Invalidate()
End Sub


Public Class clsMonth
Private mID As Integer
Private mSText As String
Private mLText As String

Public Sub New(ByVal ID As Integer)
SetValues(ID)
End Sub

Public Property ID() As Integer
Get
Return mID
End Get
Set(ByVal value As Integer)
SetValues(value)
End Set
End Property

Public ReadOnly Property SText() As String
Get
Return mSText
End Get
End Property

Public ReadOnly Property LText() As String
Get
Return mLText
End Get
End Property

Private Sub SetValues(ByVal ID As Integer)
Try
mID = ID
mSText = MonthName(ID, True)
mLText = MonthName(ID, False)

Catch ex As Exception
Throw New Exception _
("ID ausserhalb des Bereichs 1 ... 12")
End Try
End Sub
End Class

End Class
' \\\ E N T E

Nach dem Programmstart enthàlt das obere Grid
12 Zeilen (Monate Januar bis Dezember).
Via DragDrop können nun einzelne oder auch mehrere
markierte Zeilen in das untere Grid verschoben werden.
Das Verschieben der Zeilen geht auch umgekehrt vom
unteren ins obere Grid in gleicher Weise.

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

Ähnliche fragen