Desidero estendere DataGridView per aggiungere un secondo ContextMenu che consente di selezionare quali colonne sono visibili nella struttura. Il nuovo ContextMenu verrà visualizzato con il tasto destro del mouse sull'intestazione di una colonna.Come posiziono correttamente un menu contestuale quando faccio clic con il pulsante destro del mouse su un'intestazione di colonna di DataGridView?
Ho difficoltà a ottenere la posizione orizzontale corretta per mostrare il menu di scelta rapida. Come posso correggere questo?
public partial class Form1 : Form
{
DataGridView dataGrid;
ContextMenuStrip contextMenuStrip;
public Form1()
{
InitializeComponent();
dataGrid = new DataGridView();
Controls.Add(dataGrid);
dataGrid.Dock = System.Windows.Forms.DockStyle.Fill;
dataGrid.ColumnHeaderMouseClick += new System.Windows.Forms.DataGridViewCellMouseEventHandler(ColumnHeaderMouseClick);
dataGrid.DataSource = new Dictionary<string, string>().ToList();
contextMenuStrip = new ContextMenuStrip();
contextMenuStrip.Items.Add("foo");
contextMenuStrip.Items.Add("bar");
}
private void ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
contextMenuStrip.Show(PointToScreen(e.Location));
}
}
}
Il menu dei contenuti viene visualizzato nell'angolo in alto a sinistra dello schermo, poiché e.location è la posizione del mouse all'interno dell'intestazione della colonna. Ho risolto il problema ora ma grazie per l'aiuto. –
In base alla tua risposta alla tua domanda e.location è all'interno di datagrid, non di columnheader, quindi competent_tech era corretto. –
Sembrerebbe che abbia provato male la risposta competente_tech e che sia effettivamente corretto se usato all'interno dell'evento MouseDown. –