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