válido valor pasar net datos c# datagridview datagridviewcombobox

c# - pasar - DataGridViewComboBoxCell Binding: "el valor no es válido"



meter un combobox en un datagridview (9)

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

Estoy tratando de unir celdas ComboBox separadas dentro de un DataGridView a una clase personalizada y sigo recibiendo un error

El valor DataGridViewComboBoxCell no es válido

Actualmente estoy asignando el origen de datos para la celda a un IList<ICustomInterface> de IList<ICustomInterface> desde un diccionario que tengo. Sin embargo, al configurar la fuente de datos, el índice de ComboBoxCell no se establece, por lo que tiene un valor no válido seleccionado.

Estoy tratando de averiguar cómo hacer que seleccione un valor real, por ejemplo, el elemento 0 de la lista que se le ha dado para eliminar este error, o buscar otra manera de resolver el problema. ¿Alguien tiene alguna sugerencia?


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.


Estaba teniendo el mismo problema. El mensaje fue 100% puntual. Los valores para el combobox eran como: Exact, StartsWith ... y estaba intentando establecer el valor Exactă (no Exact). Esto sucedía automáticamente cuando leía DataTable para DataGridView desde un archivo .xml con DataTable.ReadXml (...). Los valores en el archivo .xml estaban desactivados.


Establecer un valor nulo a la celda:

dataGridView.CurrentRow.Cells[NAME].Value = null;


Estoy teniendo el mismo problema. Después de rellenar mi columna ComboBox en el DataGrid (desautorizado), resolví mi problema configurando la propiedad ValueMember de DataGridViewComboBoxColumn Aparentemente, solo ToString() en la propiedad ToString() de los objetos en ComboBox no es suficiente.

Código actual:

/// <summary> /// Populate the dataGridSplitVolumes data grid with all existing qualifications for the plan. /// </summary> /// <param name="bonus"></param> private void PopulateDataGridSplitVolumes(Bonus_Group bonus) { try { List<Qualification> qualifications = Qualification.Load(this.groupBonus.PlanID, this.ConnectionString); foreach (Qualification qual in qualifications) { DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)this.dataGridSplitVolumes.Columns[0]; col.Items.Add(qual); } SplitVolumeGrid_QualificationColumn.ValueMember = "Name"; } catch (Exception ex) { #if DEBUG System.Diagnostics.Debugger.Break(); #endif throw ex; } }//PopulateDataGridSplitVolumes


Logré 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 encontraría automáticamente el objeto en la fuente y se actualizaría.

Este no era realmente el caso, realmente necesita establecer el valor igual al de la propiedad ValueMember para que actualice correctamente el valor y el enlace. Creo que estaba usando una propiedad ''Nombre'' tanto para ValueMember como para DisplayMember (controla cómo se procesa en la celda) para que el valor de interface.ToString() (en lugar de la instancia de interface) funcione en la mayoría de los casos. Luego detecto e ignoro cualquier excepción de DataError que ocurra mientras estoy cambiando la fuente.


Por el bien de las personas que no luchan tanto como yo.

Al enlazar el combo, está configurando un DisplayMember (lo que verá el usuario) y ValueMember (lo que obtendrá su aplicación).

Después de configurarlos, debe configurar el Valor y aquí es donde falla. Básicamente, el TIPO del valor debe ser el mismo TIPO que el ValueMember.

Entonces, si su miembro de valor es un ID, obviamente, es de tipo INT y necesita establecer su valor en int, por ejemplo, Cell.Value = 1 ;.


Yo tuve el mismo problema.

En mi caso, la solución fue rellenar el adaptador de datos de la tabla de clave externa. Esto no se estaba llenando automáticamente y esta fue la causa del problema.

En el evento Page_Load :

Me.TblUserTypesTableAdapter.Fill(Me.DonateDataSet.tblUserTypes)


utilizar el controlador de eventos DataError,

private void shahriartableDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e) { //You don''t have to write anything here ! }

y su tipo de datos DisplayMember y ValueMember deberían ser los mismos, en mi caso tengo CountryName para ambos. Todo funciona bien para mi ... !!