visual net evento event doble derecho c# .net winforms datagridview

c# - net - Mantenga múltiples selecciones al hacer clic con el mouse y realice más funcionalidades



mouseup c# (2)

Hola, estoy haciendo una aplicación en C #.

Lo que intento lograr

  • Selecciono Varias filas con CTRL entre los resultados en DataGridView
  • luego hago clic derecho y muestra opciones
  • Haga clic en elegir la opción seleccionada
  • Las filas elegidas permanecen en DataGridView y se eliminan otras filas

Problema donde me quedé atascado

  • Selecciono Varias filas con CTRL
  • Pero cuando hago clic derecho en las filas, la selección múltiple desaparece

Nota: Estoy utilizando el evento MouseClick para hacer clic con el botón derecho en las filas y generar un menú. El código de este evento se da a continuación:

private void SearchPanelDataGridView_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip(); var htest = SearchPanelDataGridView.HitTest(e.X, e.Y); SearchPanelDataGridView.ClearSelection(); SearchPanelDataGridView.Rows[htest.RowIndex].Selected = true; smenu.Items.Add("Clear Record").Name = "Clear Record"; smenu.Items.Add("Pay Amount").Name = "Pay Amount"; smenu.Items.Add("Break Apart").Name = "Break Apart"; smenu.Items.Add("View Details").Name = "View Details"; smenu.Items.Add("Choose Selected").Name = "Choose Selected"; // Choose Rows Option smenu.Items.Add("Reset").Name = "Reset"; int CurrentMouseOverRow = SearchPanelDataGridView.HitTest(e.X, e.Y).RowIndex; smenu.Show(SearchPanelDataGridView, new Point(e.X, e.Y)); smenu.ItemClicked += new ToolStripItemClickedEventHandler(smenu_ItemClicked); } }


No es necesario que maneje el evento MouseClick . Simplemente cree el ContextmenuStrip usando el diseñador o en evento de carga del formulario. A continuación, asigne la tira de menú contextual a ContextMenuStrip propiedad ContextMenuStrip de DataGridView , luego maneje el evento Click del ToolStripMenuItem que debería eliminar las filas no seleccionadas y usar dicho código:

dataGridView1.Rows.Cast<DataGridViewRow>() .Where(x => !dataGridView1.SelectedRows.Contains(x) && !x.IsNewRow) .ToList().ForEach(x => dataGridView1.Rows.Remove(x));

De esta forma, todas las filas no seleccionadas se eliminarán y la selección permanecerá intacta.


Puede que esta no sea la mejor solución, pero por ahora puedes intentar esto:

List<int> selectedRowsIndexes = new List<int>(); private void dataGridView1_Click(object sender, EventArgs e) { selectedRowsIndexes.Clear(); foreach (DataGridViewRow row in dataGridView1.SelectedRows) selectedRowsIndexes.Add(row.Index); } private void dataGridView1_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip(); var htest = dataGridView1.HitTest(e.X, e.Y); dataGridView1.ClearSelection(); dataGridView1.Rows[htest.RowIndex].Selected = true; smenu.Items.Add("Clear Record").Name = "Clear Record"; smenu.Items.Add("Pay Amount").Name = "Pay Amount"; smenu.Items.Add("Break Apart").Name = "Break Apart"; smenu.Items.Add("View Details").Name = "View Details"; smenu.Items.Add("Choose Selected").Name = "Choose Selected"; // Choose Rows Option smenu.Items.Add("Reset").Name = "Reset"; int CurrentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex; smenu.Show(dataGridView1, new Point(e.X, e.Y)); foreach (int rowIndex in selectedRowsIndexes) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { dataGridView1.Rows[i].Selected = (i == rowIndex); } } } }

Para que esto funcione, la propiedad SelectionMode de DataGridView debe establecerse en FullRowSelect.