2015-04-06 5 views
1

Как только я выбрал несколько ячеек в представлении datagridview, я хочу, чтобы моя текущая ячейка была равна первой ячейке, выбранной в представлении datagridview. Проблема, с которой я столкнулась, заключается в том, что после того, как выбор сделан (с помощью мыши), я устанавливаю текущую ячейку в первую выбранную ячейку (me.datagridview.currentcell =), но это удаляет все остальные варианты в datagridview , Кто-нибудь знает способ изменения текущей ячейки, не снимая выбор datagridview. Текущий пример кода ниже:Измените текущую ячейку, не снимая выделение

Private Sub DataGridView1_CellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp 

    a = 0 
    Do While a < Me.DataGridView1.RowCount 
     b = 0 
     Do While b < Me.DataGridView1.ColumnCount 
      If Me.DataGridView1.Rows(a).Cells(b).Selected = True Then 
       Me.DataGridView1.CurrentCell = Me.DataGridView1.Rows(a).Cells(b) 
       GoTo skipstep 
      End If 
      b += 1 
     Loop 
     a += 1 
    Loop 

    skipstep: 

    End Sub 

ответ

2

Если вы посмотрите на исходный код для CurrentCell собственности, вы увидите, что она делает вызов ClearSelectionперед темSetCurrentCellAddressCore. Но вы не можете назвать «SCCAC», потому что он определен как Protected. Поэтому мое лучшее предложение состоит в том, что вы подклассифицируете DGV и создаете новый публичный метод.

Public Class UIDataGridView 
    Inherits DataGridView 

    Public Sub SetCurrentCell(cell As DataGridViewCell) 
     If (cell Is Nothing) Then 
      Throw New ArgumentNullException("cell") 
     'TODO: Add more validation: 
     'ElseIf (Not cell.DataGridView Is Me) Then 
     End If 
     Me.SetCurrentCellAddressCore(cell.ColumnIndex, cell.RowIndex, True, False, False) 
    End Sub 

End Class 

Если вы не хотите подклассифицировать DGV, тогда отражение является вашим единственным вариантом.

Imports System.Reflection 

Private Sub HandleCellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseDown 
    Me.firstCell = If(((e.ColumnIndex > -1) AndAlso (e.RowIndex > -1)), Me.DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex), Nothing) 
End Sub 

Private Sub HandleCellMouseUp(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseUp 
    If ((Not Me.firstCell Is Nothing) AndAlso (Me.firstCell.Selected AndAlso (Me.DataGridView1.SelectedCells.Count > 1))) Then 

     Dim type As Type = GetType(DataGridView) 
     Dim flags As BindingFlags = (BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.Public Or BindingFlags.NonPublic) 
     Dim method As MethodInfo = type.GetMethod("SetCurrentCellAddressCore", flags) 

     method.Invoke(Me.DataGridView1, {Me.firstCell.ColumnIndex, Me.firstCell.RowIndex, True, False, False}) 

     Debug.WriteLine("First cell is current: {0}", {(Me.DataGridView1.CurrentCell Is Me.firstCell)}) 

    End If 
End Sub 

Private firstCell As DataGridViewCell 

PS: Вы забыли, что пользователи могут выбрать ячейки с помощью клавиатуры? ;)

+0

Это действительно хороший ответ, спасибо кучам. Не могу получить свой первый вариант работы (я довольно новичок в VB.NET, мне нужно поиграть с ним немного больше), но ваш второй вариант работает как шарм. Еще раз спасибо!!! – Jarron

+0

Для варианта 1 это то, что вам нужно сделать: в «Области обозревателя решений» щелкните правой кнопкой мыши имя вашего приложения и перейдите в «Добавить> Класс». Измените имя на «UIDataGridView.vb» и нажмите «Добавить». Замените автоматически сгенерированный код кодом в моем ответе (первая часть). Восстановите свое решение. Пользовательский элемент управления теперь доступен в верхней части панели «Панель инструментов». Вы можете перетащить этот элемент управления на форму. О, и с тех пор, как вы новичок, вот про-совет: Установите строгий параметр компилятора на 'On'. Это очень важно. https://msdn.microsoft.com/en-us/library/zcd4xwzs.aspx?f=255&MSPPError=-2147217396 –

Смежные вопросы