6

Tôi đang sử dụng sự kiện (EditingControlShowing) để Bật Tự động hoàn thành trong cột DataGridViewComboBox.Thật là một hành vi lạ trong AutoComplete trong cột 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; 
    } 
} 

Nhưng nó có một hành vi kỳ lạ, khi tôi gõ một số ký tự sau đó tôi rời khỏi tế bào (Tab hoặc phím phải), giá trị không thay đổi.
Nhưng nếu tôi lặp lại điều đó, giá trị sẽ thay đổi. Từ Here, bạn có thể tải xuống mã nguồn và video (EXE) giải thích sự cố.

Bạn có thể giúp tôi làm cho nó hoạt động chính xác không?

+0

Sự cố thú vị và hoạt động tốt trong quá trình sửa! Tôi đã thêm bản sửa lỗi thay thế sử dụng mã ít hơn một chút mà bạn có thể thấy hữu ích. –

Trả lời

4

Dường như cho rằng nhập đầu tiên vào combobox tab không còn gây nên các cam kết về giá trị. Không có ý tưởng tại sao điều này là như vậy, nhưng nó xuất hiện mà xử lý CurrentCellDirtyStateChanged và cam kết sửa chữa nó.

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

cảm ơn ... điều này cũng phù hợp với tôi .. – houssam

1

Tôi giải quyết nó như thế này:

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; 

}