6

Estoy utilizando el evento (EditingControlShowing) para habilitar Autocompletar en columna DataGridViewComboBox.¿Qué comportamiento extraño en Autocompletar en la columna DataGridViewCombobox?

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (e.Control is DataGridViewComboBoxEditingControl) 
    { 
     ComboBox combo = (ComboBox)e.Control; 
     ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown; 
     ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems; 
     ((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; 
    } 
} 

Pero tiene un comportamiento extraño, al escribir algunos caracteres a continuación les dejo el celular (Tab o la tecla derecha), el valor no ha cambiado.
Pero si repito eso, el valor cambiará. Desde Here, puede descargar el código fuente y el video (EXE) que explica el problema.

¿Podría ayudarme a hacerlo funcionar correctamente?

+0

¡Problema de interés y buen trabajo en la solución! He agregado una solución alternativa que utiliza un código un poco menos que puede serle útil. –

Respuesta

4

Parece que para la primera entrada en la lista desplegable de la pestaña ya no activa el envío de datos del valor. No tengo idea de por qué esto es así, pero parece que manejar CurrentCellDirtyStateChanged y confirmar la edición lo corrige.

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    // You could also check here to see if the cell in question is the combobox 
    if (dataGridView1.IsCurrentCellDirty) 
    { 
     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 
    } 
} 
+0

gracias ... también esto funciona para mí ... – houssam

1

Lo resuelto de esta manera:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (e.Control is DataGridViewComboBoxEditingControl) 
    { 
     ComboBox combo = (ComboBox)e.Control; 
     ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown; 
     ((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; 
     ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems; 
     combo.Validated -= new EventHandler(combo_Validated); 
     combo.Validated += new EventHandler(combo_Validated); 

    } 
} 

public static object GetPropValue(object src, string propName) 
{ 
    if (src == null) 
     return null; 
    return src.GetType().GetProperty(propName).GetValue(src, null); 
} 

void combo_Validated(object sender, EventArgs e) 
{ 
    Object selectedItem = ((ComboBox)sender).SelectedItem; 
    DataGridViewComboBoxColumn col = (DataGridViewComboBoxColumn)dataGridView1.Columns[dataGridView1.CurrentCell.ColumnIndex]; 
    if (!String.IsNullOrEmpty(col.ValueMember)) 
     dataGridView1.CurrentCell.Value = GetPropValue(selectedItem, col.ValueMember); 
    else 
     dataGridView1.CurrentCell.Value = selectedItem; 

}