Me gustaría ampliar DataGridView para agregar un segundo ContextMenu que seleccione qué columnas son visibles en el ceñidor. El nuevo ContextMenu se mostrará al hacer clic derecho en el encabezado de una columna.¿Cómo coloco correctamente un menú contextual cuando hago clic con el botón derecho en el encabezado de columna de DataGridView?
Tengo dificultades para obtener la posición horizontal correcta para mostrar el menú contextual. ¿Cómo puedo corregir esto?
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));
}
}
}
El menú de contenido aparece en la esquina superior izquierda de la pantalla, ya que e.location es la posición del mouse dentro del encabezado de la columna. Ya resolví el problema, pero gracias por ayudarme. –
De acuerdo con su respuesta a su pregunta, la ubicación de e está dentro de la cuadrícula de datos, no del encabezado, así que competente_tech estaba correcto. –
Parece que probé mal la respuesta de competente_tech y de hecho es correcto si se usa dentro del evento MouseDown. –