6

( 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;
    }
}

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

正しく動作させるために私を助けてもらえますか?

4

2 に答える 2

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);
    }
}
于 2012-08-31T20:53:21.927 に答える
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;

}
于 2012-08-31T20:43:14.643 に答える