brzt Ответов: 2

vb.net, полоса контекстного меню DatagridView при щелчке правой кнопкой мыши по строке. Неправильное Расположение!


В основном то, что у меня есть, - это Datagridview, который я хочу показать полосе контекстного меню, когда она щелкнута правой кнопкой мыши. Но только при щелчке правой кнопкой мыши по ячейке, а не по заголовку или пустой части элемента управления datagridview. Я также хочу, чтобы он выделил всю строку при щелчке правой кнопкой мыши. У меня работает выбор строки, и открывается полоса контекстного меню, но она открывается далеко от мыши, как показано на скриншоте.

Private Sub DgvDelays_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DgvDelays.CellMouseDown
    Dim rowClicked As DataGridView.HitTestInfo = DgvDelays.HitTest(e.X, e.Y)
    'Select Right Clicked Row if its not the header row
    If e.Button = Windows.Forms.MouseButtons.Right AndAlso e.RowIndex > -1 Then
        'Clear any currently sellected rows
        DgvDelays.ClearSelection()
        Me.DgvDelays.Rows(e.RowIndex).Selected = True
        CmsRightClick.Show(DgvDelays, New System.Drawing.Point(Windows.Forms.Cursor.Position))

    End If

End Sub


Изображение[^]

Sergey Alexandrovich Kryukov

Система.Окна.Формы? Пометьте его!
—СА

Sergey Alexandrovich Kryukov

Итак, является ли расположение строки контекстного меню единственной проблемой? Что это за строка кода, показывающая его? CmsRightClick.Показать?
—СА

brzt

Да просто место, где он загружается, я включил весь свой код для субмарины, так как думал, что это может быть частью проблемы.

CmsRightClick.Show(DgvDelays, Новая Система.Рисование.Точка(Окна.Формы.Указатель.Позиция))

^^Код, Который Показывает Меню^^

Sergey Alexandrovich Kryukov

Ладно, я так и думал. Тогда у меня есть решение для вас; пожалуйста, смотрите решение 1.
Надеюсь, это сработает для вас, чтобы вы могли официально принять его (зеленая кнопка).
—СА

brzt

Спасибо Дружище,
Направляюсь на празднование Дня ная. Проверим и подтвердим, что он работает завтра, и примем решение, если оно есть. Спасибо :D

Sergey Alexandrovich Kryukov

Конечно. С Наступающим Новым Годом!
—СА

brzt

Эй СА,
У меня возникли проблемы с тем, чтобы заставить ваше решение работать. Может быть, вам поможет еще какая-нибудь информация.

CmsRightClick.Show(DgvDelays, Новая Система.Рисование.Точка(Окна.Формы.Указатель.Позиция))

Cmsrightclick <- полоса контекстного меню под названием CmsRightClick
DgvDelays <- элемент управления представлением сетки данных, называемый DgvDelays

Sergey Alexandrovich Kryukov

В чем проблема? Посмотрите на параметры функции: один из них-e как система.Окна.Формы.DataGridViewCellMouseEventArgs.

Попробуй:

CmsRightClick.Show(DgvDelays, Новая Система.Рисование.Пункт(e.Х, Эл.Г))

—СА

brzt

Это то, что я пробовал, но меню открывается далеко.
http://img23.imageshack.us/img23/9955/help2p.jpg

Sergey Alexandrovich Kryukov

Вы уверены, что это одно и то же?
Разве сдвиг не равен расположению элемента управления в координатах экрана? Вы не могли бы проверить?
—СА

Sergey Alexandrovich Kryukov

Вы должны сделать какую-то ошибку. Разве вы не сделали что-то еще, например CmsRightClick.Показать(электронная.Х,Эл.Г)? Это не одно и то же.

Шоу тоже число параметров отображается в экранных координатах.
—СА

brzt

Частная суб DgvDelays_CellMouseClick(как byval отправителя как объект, как byval E Как системы.Окна.Формы.DataGridViewCellMouseEventArgs) Обрабатывает DgvDelays.CellMouseDown
Тусклый rowClicked как DataGridView.HitTestInfo = DgvDelays.HitTest(e.X, e.Y)


'Выберите строку, щелкнутую Правой Кнопкой Мыши, если это не строка заголовка
Если e.Button = Windows.Формы.Кнопки мыши.Справа AndAlso e.RowIndex > -1 затем
- Очистить все проданные в данный момент строки
DgvDelays.Не()
Я.DgvDelays.Строки(e.Параметр rowindex).Selected = True
CmsRightClick.Show(DgvDelays, Новая Система.Рисование.Пункт(e.Х, Эл.Г))
-CmsRightClick.Show(DgvDelays, Новая Система.Рисование.Точка(Окна.Формы.Указатель.Позиция))
Конец, Если


Конец Подводной Лодки

Sergey Alexandrovich Kryukov

Хм... выглядит правильно...
Вы уверены, что следующая строка действительно была закомментирована? :-)
Пожалуйста, смотрите, я обновил ответ с вариантами разрешения... другие методы показа должны работать с Windows.Формы.Указатель.Позиция.
—СА

brzt

На 100% уверен, что его прокомментировали. 
Я тоже не знаю, почему это не работает. Я собираюсь попробовать скомпилировать его и запустить на другом компьютере, чтобы увидеть, что он, возможно, связан с моей локальной машиной. Это рискованно, но я не знаю, что еще можно попробовать.

Sergey Alexandrovich Kryukov

Я не думаю, что это сработает. Попробуйте другой метод. После [EDIT] я перечислил 4. Это просто... требует некоторого внимания и работы/отладки. Я смутно помню, что мне пришлось потратить некоторое время, когда я хотел показать контекстное меню в нужном месте. Может быть, e.X и e.Y-это не то, что мы ожидаем. Вы всегда можете проверить координаты под отладчиком.
—СА

brzt

Хорошо, я думаю, что понял, что происходит, возвращаемые позиции e.x и e.y имеют отношение к ячейке. Это означает, что верхний левый угол любой ячейки равен 0,0.
Остается вопрос, как это исправить. Если я запускаю его код только при наведении мыши на элемент управления, он не только показывает контекстное меню, когда вы щелкаете правой кнопкой мыши по ячейке, но и показывает его, когда вы щелкаете правой кнопкой мыши в любом месте элемента управления.

Sergey Alexandrovich Kryukov

Правильно, хорошо! Но в чем проблема? Затем используйте одно из двух оставшихся решений, с курсором.Позиция. Используйте его с одним из двух других методов показа. (Или найдите координату ячейки и добавьте ее.)
—СА

brzt

Я думаю, что нашел более простое решение

brzt

Большое вам спасибо за вашу помощь, последние несколько дней у меня от этого голова идет кругом.

Sergey Alexandrovich Kryukov

И я думаю, что вы должны принять мое решение формально (зеленая кнопка), так как оно правильное (я исправлю только одно утверждение) — спасибо.
—СА

brzt

Счастлив Выбрать Оба Варианта Как Правильные.

Sergey Alexandrovich Kryukov

Спасибо.
Удачи, звоните еще раз.
-СА

2 Ответов

Рейтинг:
4

brzt

Хорошо, я нашел решение, используя общедоступные переменные, а затем сохраняя местоположение, в котором щелкает мышь, когда она щелкает в любом месте элемента управления, но только запускает контекстное меню show, когда мышь находится на ячейке.

Очень большое спасибо Сергею Александровичу Крюкову за то, что он проработал это со мной


Public Shared MouseX As Integer
Public Shared MouseY As Integer


Затем Используйте Следующий Код Для Мыши Вниз По Ячейке

Private Sub DgvDelays_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DgvDelays.MouseDown
    MouseX = e.X
    MouseY = e.Y
End Sub


И следующий код в ячейке мыши вниз

Private Sub DgvDelays_CellMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DgvDelays.CellMouseDown
    Dim rowClicked As DataGridView.HitTestInfo = DgvDelays.HitTest(e.X, e.Y)

    'Select Right Clicked Row if its not the header row
    If e.Button = Windows.Forms.MouseButtons.Right AndAlso e.RowIndex > -1 Then
        'Clear any currently sellected rows
        DgvDelays.ClearSelection()
        Me.DgvDelays.Rows(e.RowIndex).Selected = True
        CmsRightClick.Show(DgvDelays, New System.Drawing.Point(MouseX, MouseY))
    End If


End Sub


Рейтинг:
15

Sergey Alexandrovich Kryukov

Пожалуйста, смотрите мои комментарии к этому вопросу — я не уверен на 100%, что понимаю ваш код, потому что показан неполный код. Если некоторые из моих предположений неверны, мы можем разобраться, если вы проясните это.

Похоже, что вы получаете положение курсора в координатах экрана, а меню создается в управляющих координатах. Вам нужно добавить соответствующую смену. Одним из способов сделать это является пара методов: System.Windows.Forms.Control.PointToClient и System.Windows.Forms.Control.PointToScreen Пожалуйста, смотрите:
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoclient.aspx[^],
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.pointtoscreen.aspx[^].

Другой подход: не используйте Windows.Forms.Cursor.Position. Получите координаты мыши в системе координат элемента управления в первую очередь, обработав событие MouseUp об этом контроле.

[РЕДАКТИРОВАТЬ]

Не путайте разные вещи Show методы.

Эти два показывают в координатах экрана:
http://msdn.microsoft.com/en-us/library/xz0wbhy2.aspx[^],
http://msdn.microsoft.com/en-us/library/7z41k67k.aspx[^].

Эти два параметра отображаются относительно контрольных проходов в качестве первого параметра:
http://msdn.microsoft.com/en-us/library/71tzk45y.aspx[^],
http://msdn.microsoft.com/en-us/library/15e8969w.aspx[^].

В первом случае вы можете использовать Windows.Forms.Cursor.Position, во втором случае — координаты, переданные в параметре e Используйте некоторое дополнительное внимание; легко ошибиться.

Удачи,

—СА