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.