(NET) NET (2004 год)

Drag-and-Drop

Здесь для демонстрации техники Drag-And-Drop я выкладываю исходники одной своей очень хорошо откоментированной формы.





00001: Public Class frNxFirmMap
00002: 
00003:     Dim ImportNumber As Integer
00004: 
00005:     Private Sub frNxFirmMap_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
00006:         Me.Text &= " (импорт " & ImportNumber.ToString & " )"
00007:         My.Application.DoEvents()
00008:         Me.MyFirmTableAdapter.Fill(Me.MyFirm._MyFirm)
00009:     End Sub
00010: 
00011:     Private Sub rbNull_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbNull.Click
00012:         Me.NxPrice.Clear()
00013:         Me.NxShopTableAdapter.FillByNullFirm(Me.NxPrice.NxShop)
00014:     End Sub
00015: 
00016:     Private Sub rbNotNull_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbNotNull.Click
00017:         Me.NxPrice.Clear()
00018:         Me.NxShopTableAdapter.FillByNotNullFirm(Me.NxPrice.NxShop)
00019:     End Sub
00020: 
00021:     Private Sub frNxFirmMap_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
00022:         FirmGridView.Height = Me.Height - 135
00023:         TovarGridView.Height = Me.Height - 60
00024:         TovarGridView.Width = Me.Width - 210
00025:         TovarGridView.Columns(4).Width = TovarGridView.Width - 170
00026:     End Sub
00027: 
00028:     'начальный момент добавления строки
00029:     Private Sub MyFirmBindingSource_AddingNew(ByVal sender As Object, ByVal e As System.ComponentModel.AddingNewEventArgs) Handles MyFirmBindingSource.AddingNew
00030:         'текущая (MyFirmBindingSource.Position) остается пока на старой позиции, поэтому обновляем все перед выходом из формы
00031:     End Sub
00032: 
00033:     'перед выходом из формы переносим в базу все добавленные фирмы
00034:     Private Sub frNxFirmMap_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
00035:         Dim i As Integer
00036:         For i = 0 To Me.MyFirm._MyFirm.Rows.Count - 1
00037:             If Me.MyFirm._MyFirm.Rows(i).RowState = DataRowState.Added Then
00038:                 Me.MyFirmTableAdapter.Insert1(FirmGridView.CurrentRow.Cells(1).Value)
00039:             End If
00040:         Next
00041:     End Sub
00042: 
00043: 
00044:     Private Sub btUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btUpdate.Click
00045:         'другой вариант - пакетное обновление - выбрать в XML все изменения:
00046:         'nxprice.NxShop.WriteXml("C:\1.xml",system.Data.XmlWriteMode.DiffGram)
00047:         If Me.NxPrice.NxShop.GetChanges Is Nothing Then Exit Sub
00048:         Dim UpdatingRows As System.Data.DataRowCollection
00049:         UpdatingRows = Me.NxPrice.NxShop.GetChanges.Rows
00050:         Dim i As Integer
00051:         For i = 0 To UpdatingRows.Count - 1
00052:             Me.NxShopTableAdapter.UpdateNxNewFirm(UpdatingRows.Item(i).Item(3), UpdatingRows.Item(i).Item(0))
00053:         Next
00054:         'вносим обновления в DS (теперь их уже не будет видно по Me.NxPrice.NxShop.GetChanges)
00055:         Me.NxPrice.NxShop.AcceptChanges()
00056:     End Sub
00057: 
00058:     'Dim DragCursor As New Cursor("cursor1.cur") 'просто из файла
00059:     Dim DragCursor As New Cursor(Me.GetType(), "Cursor1.cur") 'непосредственно Embedded Resource из сборки
00060: 
00061:     'с этого начинается Drag-and-Drop
00062:     'ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.NETDEVFX.v20.en/CPref17/html/M_System_Windows_Forms_Control_DoDragDrop_1_334b7c3a.htm
00063:     Private Sub FirmGridView_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles FirmGridView.MouseDown
00064:         Dim DragDropResult As DragDropEffects
00065:         FirmGridView.CurrentRow.Selected = True
00066: 
00067:         'в этом методе происходит ВЕСЬ Drag-And-Drop и все последующие события
00068:         DragDropResult = FirmGridView.DoDragDrop(FirmGridView.CurrentRow.Cells(1).Value, DragDropEffects.Copy)
00069:         'после завершения буксировки в исходном контроле ничего не меняем
00070:     End Sub
00071: 
00072:     Private Sub FirmGridView_QueryContinueDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.QueryContinueDragEventArgs) Handles FirmGridView.QueryContinueDrag
00073:         'процесс движения по контролу-источнику. Тут можно остановить буксировку
00074:         'e.Action = System.Windows.Forms.DragAction.Drop
00075:         Cursor.Current = DragCursor
00076:     End Sub
00077: 
00078:     Private Sub FirmGridView_GiveFeedback(ByVal sender As Object, ByVal e As System.Windows.Forms.GiveFeedbackEventArgs) Handles FirmGridView.GiveFeedback
00079:         e.UseDefaultCursors = False
00080:         Cursor.Current = DragCursor
00081:     End Sub
00082: 
00083:     Private Sub TovarGridView_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TovarGridView.DragEnter
00084:         'вход мышей в границы контрола
00085:         Dim PT As System.Drawing.Point, IndexRowOnMouse As Integer
00086:         If e.Data.GetDataPresent(System.Windows.Forms.DataFormats.UnicodeText) Then
00087:             'переходим во внутренние координаты контрола
00088:             PT = CType(sender, DataGridView).PointToClient(New System.Drawing.Point(e.X, e.Y))
00089:             'отсчет от первой отображенной на экране строки
00090:             IndexRowOnMouse = TovarGridView.FirstDisplayedScrollingRowIndex + PT.Y / TovarGridView.RowTemplate.Height - 1
00091:             TovarGridView.Rows(IndexRowOnMouse).Selected = True
00092:         End If
00093:     End Sub
00094: 
00095:     Private Sub TovarGridView_DragLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TovarGridView.DragLeave
00096:         'выход мышкой за границы приемного контрола - ничего не делаем 
00097:     End Sub
00098: 
00099:     Private Sub TovarGridView_DragOver(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TovarGridView.DragOver
00100:         'мыша уже на приемном контроле - принимаем тип буксировки, заданной в FirmGridView.DoDragDrop
00101:         'вызываем событие TovarGridView_DragDrop
00102:         e.Effect = DragDropEffects.Copy
00103:     End Sub
00104: 
00105:     Private Sub TovarGridView_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TovarGridView.DragDrop
00106:         'буксировка закончена - сначала просто засвечивечиваем перенесенные данные
00107:         Dim OneRow As DataGridViewRow
00108:         For Each OneRow In TovarGridView.SelectedRows
00109:             OneRow.Cells(2).Value = FirmGridView.CurrentRow.Cells(1).Value
00110:         Next
00111:         'теперь вносим изменения в DataSet
00112:         For Each OneRow In TovarGridView.SelectedRows
00113:             TovarGridView.UpdateCellValue(2, OneRow.Index)
00114:         Next
00115:     End Sub
00116: 
00117:     'щелчок по форме - сброс выделенных строк
00118:     Private Sub frNxFirmMap_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
00119:         Dim OneRow As DataGridViewRow
00120:         For Each OneRow In TovarGridView.SelectedRows
00121:             OneRow.Selected = False
00122:         Next
00123:     End Sub
00124: 
00125: 
00126: End Class

Ну напрямую эта форма, конечно у вас не заработает, тк потребует еще минимум двух DataSet и трех BindingSource, но общий принцип работы при желании понять можно.







Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21>  <22>  <23
Link to this page: //www.vb-net.com/wanted/my/draganddrop.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>