web-dev-qa-db-fra.com

Événement qui se déclenche pendant DataGridViewComboBoxColumn SelectedIndexChanged

J'ai DataGridView avec deux colonnes. La première colonne est TextBoxCol(DataGridViewTextBoxColumn) et la seconde est ComboBoxCol(DataGridViewComboBoxColumn).

Comment puis-je changer la valeur de TextBoxCol lorsque ComboBoxCol change sa valeur d'index sélectionnée? (Cela devrait se produire lorsque l'index sélectionné a changé dans ComboBoxCol. Pas après avoir quitté la colonne, comme dataGridView_CellValueChanged)

J'ai lu un sujet avec presque le même problème que j'ai, mais je ne comprends pas la réponse (qui devrait être correcte en se basant sur la coche). Voici le lien. - Presque le même sujet

21
Kalix Diona

Essayez ces deux méthodes simples (le "1" dans la méthode du haut est l'index de la colonne combobox)

La ligne à laquelle vous souhaitez apporter des modifications serait la ligne de définition cel.Value =, comme vous pouvez le changer en ce que vous voulez.


    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

29
KreepN

Cette réponse flotte à plusieurs endroits. L'utilisation de DataGridViewEditingControlShowingEventHandler déclenchera plus d'événements que prévu. Lors de mes tests, l'événement a déclenché plusieurs fois. Également, l'utilisation de l'événement combo.SelectedIndexChanged - = ne supprimera pas vraiment l'événement, ils continuent simplement à s'empiler. Quoi qu'il en soit, j'ai trouvé une solution qui semble fonctionner. J'inclus un exemple de code ci-dessous:

           // 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();
        }
     }
39
Severun

Ce lien est correct. Gérer le EditingControlShowing event de DataGridView. Dans ce gestionnaire d'événements, vérifiez si la colonne actuelle vous intéresse. Et puis créez un objet combobox temporaire: -

ComboBox comboBox = e.Control as ComboBox;

MSDN a un exemple: Voir dans l'exemple section ici . Notez le Inheritance Hierarchy & Class Syntax dans le lien msdn: -

classe publique DataGridViewComboBoxEditingControl: 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;
}
2
Angshuman Agarwal