ContextManuStripTool.show() неправильная позиция
Я пытаюсь научиться пользоваться ContextMenuStrip
при использовании этого кода:
private void DG_dataGridView_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var hitTest = DG_dataGridView.HitTest(e.X, e.Y);
if (hitTest.Type == DataGridViewHitTestType.ColumnHeader)//currentMouseOverRow >= 0)
{
string colName = DG_dataGridView.Columns[hitTest.ColumnIndex].Name;
GlobalParam.Insatance.ClickData = new RightClickData(hitTest, colName);
RightClickToolStrip.Show(DG_dataGridView, new Point(e.X, e.Y));
}
}
}
Я вижу всплывающее меню в правильном положении
но когда вместо этого я использую этот код:
private void DG_dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var hitTest = DG_dataGridView.HitTest(e.Location.X, e.Location.Y);
string colName = DG_dataGridView.Columns[e.ColumnIndex].Name;
GlobalParam.Insatance.CustomMouseGridClickData = new CustomMouseOnGridClickData(e, hitTest.Type, colName);
RightClickToolStrip.Show(DG_dataGridView, new Point(e.X, e.Y));
}
}
Я вижу всплывающее меню в левом верхнем углу моего DataGridView
Я знаю, что это связано с операцией DataGridViewCellMouseEventArgs
Я пытался установить другой контроль в toolStrip.Show
метод без успеха, что является правильным способом, чтобы получить мою позицию щелчка
1 ответ
Решение
С событием ColumnHeaderMouseClick вам не нужно проверять, щелкает ли столбец или нет, используя этот метод HitTest. Кроме того, я думаю, что координаты относятся к столбцу, по которому щелкают, поэтому вы можете попробовать использовать функцию GetColumnDisplayRectangle, чтобы сместить его свойство:
void DG_dataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
if (e.ColumnIndex > -1) {
Rectangle r = DG_dataGridView.GetColumnDisplayRectangle(e.ColumnIndex, true);
RightClickToolStrip.Show(DG_dataGridView, r.Left + e.X, r.Top + e.Y);
}
}
}