2010-10-12 6 views
3

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

+0

Si vous sélectionnez plusieurs lignes sans clé de contrôle, comment les désélectionnerez-vous? – Giorgi

+0

@Giorgi en cliquant à nouveau sur une ligne – Bolu

Répondre

5

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() 
+0

mais j'utilise le mode de sélection FullRowSelect. Je ne trouve pas l'événement FullRowSelectMouseClick. – Hukam

+0

il suffit d'utiliser cellMouseClick puis .. – Bolu

+0

J'ai testé le code u'r mais son aspect ressemble à ce gird rafraîchi chaque fois que je sélectionne une ligne. – Hukam

0

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.

0

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é.

1

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.

0

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); 
     } 
    } 
Questions connexes