2009-06-22 15 views
9

Ho problemi a gestire le selezioni in DataGridView. La mia vista griglia contiene una colonna di quantità. C'è una casella di testo sul modulo che dovrebbe visualizzare la quantità totale delle righe della vista griglia selezionate. Quindi ho bisogno di catturare gli eventi quando l'utente seleziona/deseleziona le righe di griglia e calcola (aggiungi/sottrae) l'importo di conseguenza. Ho trovato due metodi di farlo:DataGridView cattura selezione riga utente

  1. Utilizzando i RowEnter e RowLeave eventi. Questi funzionano bene quando l'utente seleziona/deseleziona una singola riga. Tuttavia, quando l'utente seleziona più righe contemporaneamente, l'evento viene generato solo per l'ultima riga. Quindi, dal mio ammontare totale solo l'importo nell'ultima riga viene aggiunto/sottratto. Quindi rendere il mio risultato errato.

  2. Utilizzo dell'evento RowStateChanged. Questo funziona per più righe. Tuttavia, l'evento viene licenziato se l'utente scorre attraverso il datagrid.

Qualcuno ha gestito un simile scenario. Vorrei sapere quale evento datagrid dovrei usare, in modo che il mio codice venga eseguito solo quando l'utente seleziona/deseleziona righe incluse più righe.

risposta

15

Trovato la soluzione. Posso usare RowStateChanged ed eseguire il mio codice solo se StateChanged per la riga è 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

È possibile utilizzare il primo metodo (riga per lasciare la fila) insieme alla proprietà SelectedRows. Significa, quando rilevi quegli eventi, e devi calcolare, invece di usare la riga dagli argomenti degli eventi, fai un loop attraverso i SelectedRows e ottieni il totale.

+0

non posso fare questo, perché ho bisogno di sottrarre quantità da quei dischi che sono stati selezionati inizialmente e non selezionati ora. –

2

Si può semplicemente catturare questo in modo seguente, ma è limitato alla selezione fila singola solo:

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

Non sufficiente quando l'utente inserisce una riga con la tastiera – Alireza

2

Penso che si può considerare l'evento SelectionChanged:

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

io uso SelectionChanged anche t o CellValueChanged evento:

 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

Che cos'è SetRowProperties? – John

Problemi correlati