2009-06-22 8 views
9

Je rencontre des difficultés pour gérer les sélections dans DataGridView. Ma vue de grille contient une colonne de montant. Il y a une zone de texte sur le formulaire qui devrait afficher la quantité totale des lignes de vue de grille sélectionnées. Par conséquent, j'ai besoin de capturer des événements lorsque l'utilisateur sélectionne/désélectionne les lignes gridview et de calculer (ajouter/soustraire) le montant en conséquence. J'ai trouvé deux méthodes de le faire:DataGridView capture sélection de ligne utilisateur

  1. Utilisation des événements RowEnter et RowLeave. Ils fonctionnent correctement lorsque l'utilisateur sélectionne/désélectionne une seule ligne. Cependant, lorsque l'utilisateur sélectionne plusieurs lignes à la fois, l'événement n'est déclenché que pour la dernière ligne. Par conséquent, à partir de mon montant total, seul le montant de la dernière rangée est ajouté/soustrait. Ainsi, mon résultat est erroné.

  2. Utilisation de l'événement RowStateChanged. Cela fonctionne pour plusieurs lignes. Cependant, l'événement se déclenche si l'utilisateur fait défiler la grille de données.

Est-ce que quelqu'un a géré un tel scénario? Je voudrais savoir quel événement datagrid je devrais utiliser, de sorte que mon code n'exécute que lorsque l'utilisateur sélectionne/désélectionne des lignes comprenant plusieurs lignes.

Répondre

15

Trouvé la solution. Je peux utiliser RowStateChanged et exécuter mon code que si StateChanged pour la ligne est Selected ...

private void dgridv_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) 
{ 
    // For any other operation except, StateChanged, do nothing 
    if (e.StateChanged != DataGridViewElementStates.Selected) return; 

    // Calculate amount code goes here 
} 
0

Vous pouvez utiliser votre première méthode (ligne Entrée ligne quitter) avec la propriété SelectedRows. C'est-à-dire, lorsque vous détectez ces événements, et que vous devez calculer, au lieu d'utiliser la ligne des arguments de l'événement, passez en revue les SelectedRows et obtenez votre total.

+0

Je ne peux pas faire cela, parce que je dois soustraire le montant de ces documents qui ont été sélectionnés au départ et ne sont pas sélectionnés maintenant. –

2

Vous pouvez simplement saisir ce qui suit en cours, mais il est limité à la sélection d'une seule ligne seulement:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) 
{ 
    MessageBox.Show("Selected row is=" + e.RowIndex); 
    // you can perform (any operation) delete action on selected row like 

    dataGridView1.Rows.RemoveAt(e.RowIndex); 
    dataGridView1.Refresh(); 
} 
+1

Pas suffisant lorsque l'utilisateur entre une ligne avec le clavier – Alireza

2

Je pense que vous pouvez envisager l'événement SelectionChanged:

private void DataGridView1_SelectionChanged(object sender, EventArgs e) { 
    textbox1.Text = DataGridView1.SelectedRows.Count.ToString(); 
} 
2

J'utilise SelectionChanged même t ou CellValueChanged événement:

 dtGrid.SelectionChanged += DataGridView_SelectionChanged; 
     this.dtGrid.DataSource = GetListOfEntities; 
     dtGrid.CellValueChanged += DataGridView_CellValueChanged; 


    private void DataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     DataGridViewRow row = dtGrid.Rows[e.RowIndex]; 
     SetRowProperties(row); 
    } 

    private void DataGridView_SelectionChanged(object sender, EventArgs e) 
    { 
     var rowsCount = dtGrid.SelectedRows.Count; 
     if (rowsCount == 0 || rowsCount > 1) return; 

     var row = dtGrid.SelectedRows[0]; 
     if (row == null) return; 
     ResolveActionsForRow(row); 
    } 
+0

Qu'est-ce que SetRowProperties? – John

Questions connexes