Quel événement attrape un changement de valeur dans une liste déroulante dans un DataGridViewCell?

Je veux gérer l'événement lorsqu'une valeur est modifiée dans un ComboBox dans a DataGridView cellule.

Il y a l'événement CellValueChanged, mais celui-ci ne se déclenche pas tant que je ne clique pas ailleurs dans le DataGridView.

Un simple ComboBox SelectedValueChanged se déclenche immédiatement après la sélection d'une nouvelle valeur.

Comment puis-je ajouter un écouteur à la liste déroulante qui se trouve à l'intérieur de la cellule?

21
demandé sur Jim Fell 2011-04-13 21:09:27

4 réponses

La réponse ci-dessus m'a conduit sur le chemin de la primevère pendant un certain temps. Cela ne fonctionne pas car cela provoque le déclenchement de plusieurs événements et continue d'ajouter des événements. Le problème est que ce qui précède attrape le DataGridViewEditingControlShowingevent et il n'attrape pas la valeur changed. Donc, il se déclenchera chaque fois que vous vous concentrez, puis quittez la liste déroulante, qu'elle ait changé ou non.

La dernière réponse à propos de "CurrentCellDirtyStateChanged" est la bonne voie à suivre. J'espère que cela aide quelqu'un à éviter de tomber un trou de lapin.

Voici du code.

        // 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 (this.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();
        }
     }
42
répondu Severun 2014-01-23 23:48:01

Vous pouvez également gérer l'événement CurrentCellDirtyStateChanged qui est appelé chaque fois qu'une valeur est modifiée, même si elle n'est pas validée. Pour obtenir la valeur sélectionnée dans la liste, vous feriez quelque chose comme:

var newValue = dataGridView.CurrentCell.EditedFormattedValue;
13
répondu Meta-Knight 2011-04-13 17:46:10

C'est le code, qui déclenchera l'événement de la sélection dans la liste déroulante dans dataGridView:

public Form1()
    {
        InitializeComponent();

        DataGridViewComboBoxColumn cmbcolumn = new DataGridViewComboBoxColumn();
        cmbcolumn.Name = "cmbColumn";
        cmbcolumn.HeaderText = "combobox column";
        cmbcolumn.Items.AddRange(new string[] { "aa", "ac", "aacc" });
        dataGridView1.Columns.Add(cmbcolumn);
        dataGridView1.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dataGridView1_EditingControlShowing);
    }

    private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        ComboBox combo = e.Control as ComboBox;
        if (combo != null)
        {
            combo.SelectedIndexChanged -= new EventHandler(ComboBox_SelectedIndexChanged);
            combo.SelectedIndexChanged += new EventHandler(ComboBox_SelectedIndexChanged);
        }
    }

    private void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
        ComboBox cb = (ComboBox)sender;
        string item = cb.Text;
        if (item != null)
            MessageBox.Show(item);
    }
12
répondu Mitja Bonca 2011-04-13 17:28:22
ComboBox cmbBox = (ComboBox)sender;                
MessageBox.Show(cmbBox.SelectedValue.ToString());
-2
répondu Sumeet Hiremath 2016-03-24 06:58:19