Выделение определенной области ячеек в DataGridView - Visual Basic .NET

Узнай цену своей работы

Формулировка задачи:

Всем Добрый День или Вечер. По пробую правильно описать что интересует может кто сталкивался. есть DataGridView в ней 10 колонок и 10 строк. выбираю ячейку в строке 2, колонке 2 протаскиваю до 5 выбираю диапазон все отлично. Когда перехожу со 2 строки на 3 система выбирает параллельный диапазон со 2 строки по 5. возможно сделать чтобы можно было выбирать со 2 строки второй колонке при переходе на 3 строку выбирались все последовательные все колонки 2 строки начиная с выбранного столбца и заканчивая 3 строкой выбранного столбца.

Решение задачи: «Выделение определенной области ячеек в DataGridView»

textual
Листинг программы
  1. Public Class DataGridViewAltSelect
  2.     Implements IDisposable
  3.  
  4.     Private _dgv As DataGridView
  5.  
  6.     Private _startColIndex As Integer
  7.     Private _startRowIndex As Integer
  8.     Private _endColIndex As Integer
  9.     Private _endRowIndex As Integer
  10.     Private _selecting As Boolean
  11.  
  12.     Private _lowColIndex As Integer
  13.     Private _lowtRowIndex As Integer
  14.     Private _upColIndex As Integer
  15.     Private _upRowIndex As Integer
  16.  
  17.     Public Sub New([DataGridView] As DataGridView)
  18.         _dgv = [DataGridView]
  19.  
  20.         AddHandler _dgv.CellMouseDown, AddressOf CellMouseDown_
  21.         AddHandler _dgv.CellMouseUp, AddressOf CellMouseUp_
  22.         AddHandler _dgv.CellEnter, AddressOf CellEnter_
  23.     End Sub
  24.  
  25.     Private Sub CellMouseDown_(sender As Object, e As DataGridViewCellMouseEventArgs)
  26.         _selecting = True
  27.         _startColIndex = e.ColumnIndex
  28.         _startRowIndex = e.RowIndex
  29.     End Sub
  30.  
  31.     Private Sub CellMouseUp_(sender As Object, e As DataGridViewCellMouseEventArgs)
  32.         _selecting = False
  33.     End Sub
  34.     Private Sub CellEnter_(sender As Object, e As DataGridViewCellEventArgs)
  35.         If _selecting Then
  36.  
  37.             Dim i As Integer
  38.  
  39.             _endColIndex = e.ColumnIndex
  40.             _endRowIndex = e.RowIndex
  41.  
  42.             If _startRowIndex < _endRowIndex Then 'проверка и инвернтирование, если стартовая строка находится выше последней выделенной
  43.                 _lowColIndex = _startColIndex
  44.                 _lowtRowIndex = _startRowIndex
  45.                 _upColIndex = _endColIndex
  46.                 _upRowIndex = _endRowIndex
  47.             Else
  48.                 _lowColIndex = _endColIndex
  49.                 _lowtRowIndex = _endRowIndex
  50.                 _upColIndex = _startColIndex
  51.                 _upRowIndex = _startRowIndex
  52.             End If
  53.  
  54.             _dgv.ClearSelection()
  55.  
  56.             If _startRowIndex = _endRowIndex Then 'если выделение происходит на одной строке
  57.                 For i = Math.Min(_lowColIndex, _upColIndex) To Math.Max(_lowColIndex, _upColIndex)
  58.                     _dgv(i, _startRowIndex).Selected = True
  59.                 Next
  60.                 Return
  61.             End If
  62.  
  63.             For i = _lowColIndex To _dgv.ColumnCount - 1 'выделение первой строки
  64.                 _dgv(i, _lowtRowIndex).Selected = True
  65.             Next
  66.  
  67.             For i = _lowtRowIndex + 1 To _upRowIndex - 1 'выделение промежуточных строк. Полное выделение
  68.                 For Each c As DataGridViewCell In _dgv.Rows(i).Cells
  69.                     c.Selected = True
  70.                 Next
  71.             Next
  72.  
  73.             For i = 0 To _upColIndex 'выделение последней строки
  74.                 _dgv(i, _upRowIndex).Selected = True
  75.             Next
  76.  
  77.         End If
  78.  
  79.     End Sub
  80.  
  81.  
  82.  
  83. #Region "IDisposable Support"
  84.     Private disposedValue As Boolean
  85.  
  86.     Protected Overridable Sub Dispose(disposing As Boolean)
  87.         If Not Me.disposedValue Then
  88.             If disposing Then
  89.                 RemoveHandler _dgv.CellMouseUp, AddressOf CellMouseUp_
  90.                 RemoveHandler _dgv.CellEnter, AddressOf CellEnter_
  91.                 RemoveHandler _dgv.CellMouseDown, AddressOf CellMouseDown_
  92.                 _dgv = Nothing
  93.             End If
  94.         End If
  95.         Me.disposedValue = True
  96.     End Sub
  97.  
  98.     Public Sub Dispose() Implements IDisposable.Dispose
  99.         Dispose(True)
  100.         GC.SuppressFinalize(Me)
  101.     End Sub
  102. #End Region
  103.  
  104. End Class

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут