6

Sto utilizzando l'evento (EditingControlShowing) per abilitare il completamento automatico nella colonna DataGridViewComboBox.Che strano comportamento in Completamento automatico nella colonna 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; 
    } 
} 

Ma ha un comportamento strano, quando si digita alcuni personaggi poi lascio la cella (Tab o tasto destro), il valore non è cambiato.
Ma se lo ripeto, il valore cambierà. Da Here, è possibile scaricare il codice sorgente e il video (EXE) che spiega il problema.

Potresti per favore aiutarmi a farlo funzionare correttamente?

+0

Interessante problema e buon lavoro sulla correzione! Ho aggiunto una soluzione alternativa che utilizza un po 'meno codice che potresti trovare utile. –

risposta

4

Sembra che per questo primo ingresso nel combobox la scheda non è più attiva il commit del valore. Non ho idea del motivo per cui è così, ma sembra che la gestione di CurrentCellDirtyStateChanged e il commit della modifica lo risolvano.

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

grazie ... anche questo funziona per me .. – houssam

1

ho risolto in questo modo:

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; 

}