Solución:
Me las arreglé para encontrar la solución poco después de publicar la pregunta. Para cualquier otra persona:
El problema era que estaba tratando de asignar el DataGridViewComboBoxCell.Value
a un objeto, esperando que debido a que la celda estaba vinculada a una fuente de datos, automáticamente encontraría el objeto en la fuente y lo actualizaría.
Este no fue realmente el caso, en realidad necesita establecer el valor igual al de la ValueMember
propiedad para que actualice correctamente el valor y el enlace. Creo que estaba usando una propiedad ‘Nombre’ para ambos ValueMember
y DisplayMember
(controla cómo se representa en la celda), por lo que establecer el Valor en interface.ToString()
(en lugar de la instancia de interfaz) funciona para la mayoría de los casos. Luego detecto e ignoro cualquier excepción de DataError que ocurra mientras cambio la fuente.
Aquí está mi solución simple al usar enumeraciones
ColumnType.ValueType = typeof (MyEnum);
ColumnType.DataSource = Enum.GetValues(typeof (MyEnum));
puede hacerlo justo después de “InitializeComponent ();”
Después de horas de pruebas, finalmente encontré una solución que funciona.
// Create a DataGridView
System.Windows.Forms.DataGridView dgvCombo = new System.Windows.Forms.DataGridView();
// Create a DataGridViewComboBoxColumn
System.Windows.Forms.DataGridViewComboBoxColumn colCombo = new
System.Windows.Forms.DataGridViewComboBoxColumn();
// Add the DataGridViewComboBoxColumn to the DataGridView
dgvCombo.Columns.Add(colCombo);
// Define a data source somewhere, for instance:
public enum DataEnum
{
One,
Two,
Three
}
// Bind the DataGridViewComboBoxColumn to the data source, for instance:
colCombo.DataSource = Enum.GetNames(typeof(DataEnum));
// Create a DataGridViewRow:
DataGridViewRow row = new DataGridViewRow();
// Create a DataGridViewComboBoxCell:
DataGridViewComboBoxCell cellCombo = new DataGridViewComboBoxCell();
// Bind the DataGridViewComboBoxCell to the same data source as the DataGridViewComboBoxColumn:
cellCombo.DataSource = Enum.GetNames(typeof(DataEnum));
// Set the Value of the DataGridViewComboBoxCell to one of the values in the data source, for instance:
cellCombo.Value = "Two";
// (No need to set values for DisplayMember or ValueMember.)
// Add the DataGridViewComboBoxCell to the DataGridViewRow:
row.Cells.Add(cellCombo);
// Add the DataGridViewRow to the DataGridView:
dgvCombo.Rows.Add(row);
// To avoid all the annoying error messages, handle the DataError event of the DataGridView:
dgvCombo.DataError += new DataGridViewDataErrorEventHandler(dgvCombo_DataError);
void dgvCombo_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
// (No need to write anything in here)
}
Eso es todo.