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
Спасибо.
Удачи, звоните еще раз.
-СА