2012-06-21 4 views
15

Ho DataGridView con due colonne. La prima colonna è TextBoxCol(DataGridViewTextBoxColumn) e la seconda è ComboBoxCol(DataGridViewComboBoxColumn).Evento che si attiva durante DataGridViewComboBoxColumn SelectedIndexChanged

Come modificare il valore di TextBoxCol quando ComboBoxCol modifica il valore di indice selezionato? (Questo dovrebbe accadere quando l'indice selezionato cambiato nel ComboBoxCol. Non dopo aver lasciato la colonna, come dataGridView_CellValueChanged)

Ho letto un argomento con quasi lo stesso problema che sto avendo, ma io non capire la risposta (che dovrebbe essere corretto base sul segno di spunta). Ecco il link. -Almost same topic

+0

Contento di poterti aiutare, terrò d'occhio per altre tue domande poiché ho già aperto il progetto :). – KreepN

+1

Possibile duplicato di [Quale evento rileva una variazione di valore in una casella combinata in una DataGridViewCell?] (Http://stackoverflow.com/questions/5652957/what-event-catches-a-change-of-value-in-a -combobox-in-a-datagridviewcell) –

risposta

23

Dare a questi due metodi semplici di go (il '1 'nel metodo superiore è l'indice della colonna della casella combinata)

La linea per la quale si apportano modifiche sarà la linea di settaggio cel.Value =, poiché è possibile cambiarla in qualsiasi modo.


private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     if (dataGridView1.CurrentCell.ColumnIndex == 1 && e.Control is ComboBox) 
     { 
      ComboBox comboBox = e.Control as ComboBox; 
      comboBox.SelectedIndexChanged -= LastColumnComboSelectionChanged; 
      comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged; 
     } 
    } 

    private void LastColumnComboSelectionChanged(object sender, EventArgs e) 
    { 
     var currentcell = dataGridView1.CurrentCellAddress; 
     var sendingCB = sender as DataGridViewComboBoxEditingControl; 
     DataGridViewTextBoxCell cel = (DataGridViewTextBoxCell)dataGridView1.Rows[currentcell.Y].Cells[0]; 
     cel.Value = sendingCB.EditingControlFormattedValue.ToString(); 
    } 

enter image description here

+8

Assicurati di rimuovere anche eventuali gestori di eventi esistenti con 'comboBox.SelectedIndexChanged - = LastColumnComboSelectionChanged;' – Smashery

2

Questo link è corretto. Gestire il EditingControlShowing event di DataGridView. In questo gestore di eventi, controlla se la colonna attuale è di tuo interesse. E, quindi creare un oggetto combobox temporanea: -

ComboBox comboBox = e.Control as ComboBox;

MSDN ha un campione: vedere nella sezione esempio here. Nota laInheritance Hierarchy & Class Syntax nel collegamento MSDN: -

classe DataGridViewComboBoxEditingControl pubblico: ComboBox, IDataGridViewEditingControl

private DataGridView dataGridView1 = new DataGridView(); 

private void AddColorColumn() 
{ 
    DataGridViewComboBoxColumn comboBoxColumn = 
     new DataGridViewComboBoxColumn(); 
    comboBoxColumn.Items.AddRange(
     Color.Red, Color.Yellow, Color.Green, Color.Blue); 
    comboBoxColumn.ValueType = typeof(Color); 
    dataGridView1.Columns.Add(comboBoxColumn); 
    dataGridView1.EditingControlShowing += 
     new DataGridViewEditingControlShowingEventHandler(
     dataGridView1_EditingControlShowing); 
} 

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e) 
{ 
    ComboBox combo = e.Control as ComboBox; 
    if (combo != null) 
    { 
     // Remove an existing event-handler, if present, to avoid 
     // adding multiple handlers when the editing control is reused. 
     combo.SelectedIndexChanged -= 
      new EventHandler(ComboBox_SelectedIndexChanged); 

     // Add the event handler. 
     combo.SelectedIndexChanged += 
      new EventHandler(ComboBox_SelectedIndexChanged); 
    } 
} 

private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    ((ComboBox)sender).BackColor = (Color)((ComboBox)sender).SelectedItem; 
} 
28

Questa risposta è che galleggiano intorno in un paio di posti. L'utilizzo di DataGridViewEditingControlShowingEventHandler attiverà più eventi di quanto tu voglia. Nel mio test ha licenziato l'evento più volte. Anche usando l'evento combo.SelectedIndexChanged - = l'evento non rimuoverà l'evento, continueranno a impilare. Ad ogni modo, ho trovato una soluzione che sembra funzionare. Inserisco un esempio di codice qui sotto:

  // Add the events to listen for 
     dataGridView1.CellValueChanged += 
      new DataGridViewCellEventHandler(dataGridView1_CellValueChanged); 
     dataGridView1.CurrentCellDirtyStateChanged += 
      new EventHandler(dataGridView1_CurrentCellDirtyStateChanged); 

    // This event handler manually raises the CellValueChanged event 
    // by calling the CommitEdit method. 
    void dataGridView1_CurrentCellDirtyStateChanged(object sender, 
     EventArgs e) 
    { 
     if (dataGridView1.IsCurrentCellDirty) 
     { 
      // This fires the cell value changed handler below 
      dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
     } 
    } 

    private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     // My combobox column is the second one so I hard coded a 1, flavor to taste 
     DataGridViewComboBoxCell cb = (DataGridViewComboBoxCell)dataGridView1.Rows[e.RowIndex].Cells[1]; 
     if (cb.Value != null) 
     { 
       // do stuff 
       dataGridView1.Invalidate(); 
     } 
    } 
+1

Questo è davvero meglio della soluzione accettata. L'unica cosa che dovevo cambiare era aggiungere se (e.RowIndex == -1) ritorno; all'inizio della funzione dataGridView1_CellValueChanged – Kevin

+0

ottima soluzione, che dovrebbe essere accettata –

+2

Sì, sicuramente una soluzione migliore, quella selezionata licenzia l'evento più volte. –