J'ai une vue en grille où je peux sélectionner plusieurs lignes en appuyant sur une touche de contrôle. Est-il possible de réaliser la même chose sans appuyer sur une touche de contrôle.Sélectionnez plusieurs lignes sans appuyer sur la touche de commande
Répondre
Comme l'action par défaut .net mettra également à jour le slectedrows
de votre datagridview
vous devez avoir un tableau pour réserver les anciennes sélections:
DataGridViewRow[] old;
qui sera mis à jour à CellMouseDown
(avant la valeur par défaut action .net modifier vos sélections):
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
old = new DataGridViewRow[dataGridView1.SelectedRows.Count];
dataGridView1.SelectedRows.CopyTo(old,0);
}
après cela, vous pouvez faire vos changements dans RowHeaderMouseClick
(comme RowHeaderSelect
est la valeur par défaut datagridview selectionmode
) ou utiliser CellMouseClick
pour FullRowSelect
et resélectionner ces vieilles lignes sélectionnées:
private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
foreach (DataGridViewRow gr in old)
{
if (gr == dataGridView1.CurrentRow)
{
gr.Selected = false;
}
else
{
gr.Selected = true;
}
}
}
Edit: Une meilleure solution:
Vous devez implémenter votre propre datagridview
dérivé de l'original et de passer outre OnCellMouseDown
& OnCellMouseClick
pour annuler la l'option par défaut désélectionne l'action et la rend lisse. faire une nouvelle classe comme quelque chose comme ceci:
Using System;
Using System.Windows.Forms;
public class myDataGridView:DataGridView
{
protected override void OnCellMouseDown(DataGridViewCellMouseEventArgs e)
{
//base.OnCellMouseDown(e);
this.Rows[e.RowIndex].Selected = !this.Rows[e.RowIndex].Selected;
}
protected override void OnCellMouseClick(DataGridViewCellMouseEventArgs e)
{
//base.OnCellMouseClick(e);
}
}
et dans votre Form.Designer.cs changer DataGridView
objet datagridview1
(si tel est le nom) à myDataGridView
objet ......
Par exemple : Changement
private System.Windows.Forms.DataGridView dataGridView1;
à
private myDataGridView dataGridView1;
et changer
this.dataGridView1=new System.Windows.Forms.DataGridView()
à
this.dataGridView1=new myDataGridView()
Vous devez vous abonner à l'événement de clic de souris et sélectionner la ligne par programmation en définissant la propriété Selected sur true. Gardez à l'esprit que si la ligne est déjà sélectionnée, vous devez la définir sur false afin que l'utilisateur puisse désélectionner la ligne.
Je ne l'ai jamais fait, mais il devrait être possible d'utiliser les événements MouseDown et MouseUp pour sélectionner les lignes qui se trouvent sous le curseur lorsque vous déplacez la souris tout en maintenant l'un des boutons enfoncé.
La façon la plus simple à mettre peut être une case à cocher dans chaque ligne et, éventuellement, une case à cocher « Sélectionner tout » sur l'en-tête.
Je devais faire cela pour un écran tactile où je voulais multiselect en un seul clic, sans cases à cocher moche. Pourquoi trop compliquer, juste garder un pas des Index'es
private List<int> SelectedIndexs { get; set; }
Puis ajouter ou les retirer de la liste que vous cliquez dessus ... Ensuite, regardez à travers vous DataGrid et sélectionnez les lignes dans la liste .
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (SelectedIndexs.Contains(e.RowIndex))
{
SelectedIndexs.Remove(e.RowIndex);
}
else
{
SelectedIndexs.Add(e.RowIndex);
}
foreach (DataGridViewRow row in this.dataGridView1.Rows)
{
row.Selected = SelectedIndexs.Contains(row.Index);
}
}
Si vous sélectionnez plusieurs lignes sans clé de contrôle, comment les désélectionnerez-vous? – Giorgi
@Giorgi en cliquant à nouveau sur une ligne – Bolu