6

Ich verwende das Ereignis (EditingControlShowing), um AutoComplete in DataGridViewComboBox-Spalte zu aktivieren.Was für ein merkwürdiges Verhalten in AutoComplete in der Spalte 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; 
    } 
} 

Aber es hat ein seltsames Verhalten, wenn ich ein paar Zeichen geben Sie dann lasse ich die Zelle (Tab oder rechte Taste), hat sich der Wert nicht ändern.
Aber wenn ich das wiederhole, wird sich der Wert ändern. Von Here können Sie den Quellcode und (EXE) Video herunterladen, das das Problem erklärt.

Könnten Sie mir bitte helfen, damit es richtig funktioniert?

+0

Interessantes Problem und schöne Arbeit an der Lösung! Ich habe ein alternatives Update hinzugefügt, das etwas weniger Code verwendet, den Sie möglicherweise nützlich finden. –

Antwort

4

Es dass die Lasche nicht mehr in der Combobox für den ersten Eintrag erscheint der Wert begehen auslöst. Keine Ahnung, warum das so ist, aber es scheint, dass die Handhabung von CurrentCellDirtyStateChanged und das Commit des Edits es behebt.

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

danke ... das funktioniert auch für mich .. – houssam

1

ich es wie folgt gelöst:

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; 

} 
Verwandte Themen