6

DataGridViewComboBox Columnで(EditingControlShowing)イベントを使用してオートコンプリートを有効にしています。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; 
    } 
} 

しかし、それは奇妙な行動を持っている私は、私はセル(Tabまたは右キー)を残して、いくつかの文字を入力すると、値は変更されませんでした。
それを繰り返すと値が変わります。 Hereから、問題を説明するソースコードと(EXE)ビデオをダウンロードできます。

正常に動作するように手伝ってください。

+0

修正に関する面白い問題と素晴らしい作業!私はあなたが有用であるかもしれない少し少ないコードを使用する代替の修正を加えました。 –

答えて

4

をコンボボックスにその最初のエントリのためのタブはもはや価値のコミットをトリガすることを表示されません。なぜそうであるのか分かりませんが、CurrentCellDirtyStateChangedを処理して編集をコミットしているように見えます。

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

ありがとう...これも私のために働く.. – houssam

1

私はこのようにそれを解決:

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; 

} 
関連する問題