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