Pregunta

Estoy intentando vincular celdas ComboBox separadas dentro de un DataGridView a una clase personalizada, y sigo recibiendo un error

  

El valor de DataGridViewComboBoxCell no es válido

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

Estoy tratando de descubrir cómo hacer que seleccione un valor real, p. el ítem 0 dentro de la lista se le ha dado para eliminar este error, o encontrar otra forma de resolver el problema. ¿Alguien tiene alguna sugerencia?

¿Fue útil?

Solución

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 un origen de datos, encontraría automáticamente el objeto en el origen y se actualizaría .

Este no fue realmente el caso, en realidad 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' para ValueMember y DisplayMember (controla cómo se procesa en la celda) configurando el valor en la interfaz .ToString ( ) (en lugar de la instancia de interfaz) funciona para la mayoría de los casos. Luego capto e ignoro cualquier excepción DataError que ocurra mientras cambio la fuente.

Otros consejos

Aquí está mi solución simple cuando uso 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.

Tuve el mismo problema.

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

En el evento Page_Load :

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

Estoy teniendo el mismo problema. Después de llenar mi columna ComboBox en el DataGrid (no adecuado), resolví mi problema estableciendo la propiedad ValueMember de DataGridViewComboBoxColumn Aparentemente, basarse en la propiedad ToString () de los objetos en el ComboBox no es suficiente.

Código real:

/// <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     

use 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 deben ser los mismos, en mi caso tengo CountryName para ambos. ¡Todo funciona bien para mí ...!

Establezca un valor nulo en la celda:

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

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

Al vincular 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 ;.

Estaba teniendo el mismo problema. El mensaje fue 100% perfecto. Los valores para el cuadro combinado eran como: Exacto, Comienza con ... e intentaba establecer el valor Exacto & # 259; (no exacto). Esto sucedía automáticamente cuando estaba leyendo DataTable para DataGridView desde un archivo .xml con DataTable.ReadXml (...). Los valores en el archivo .xml estaban desactivados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top