0

我有一個DataGridView TextBoxColumn。我希望能夠點擊單元格進入編輯模式,當我做一個下拉菜單時會出現帶有供用戶選擇的選項,或者如果用戶不需要這些選項之一,他們可以編輯該單元格(好像沒有下降)。然後當用戶離開單元格時,值(無論他們鍵入的內容或他們選擇的內容)都將被保存。C#DataGridView DataGridViewTextCell DataGridViewComboBoxCell可編輯文本

將用戶輸入選項添加到下拉列表中有很多答案,但這不是我想要的。我只想爲用戶提供一些常用選項,以便在用戶離開前自行選擇。

我不想有一個按鈕來彈出另一個輸入對話框。我不想將列轉換爲ComboBoxColumn。我不在乎是否在任何時候顯示下拉箭頭。

我試圖將TextBoxCell更改爲EditingContolShowing上的ComboBoxCell,但這被證明是毫無意義的工作。

對此有任何建議嗎?

+1

我不清楚你使用ComboBoxColumn類型的問題。你爲什麼不能使用它? – LarsTech 2015-02-05 17:40:50

+1

我需要它是一個單元格選項。列中的某些項目不需要下拉(取決於該行上的其他值),而其他項目將向用戶填充完全不同的選項列表。 – Tizz 2015-02-06 02:57:50

回答

1

您可以使用的一個選項是自動完成。這可以模仿DataGridViewTextCell上的大多數所需行爲,除了顯示進入文本單元格的所有選項以外,並且不需要將單元格類型轉換爲ComboBox。

這可能在DataGridView EditingControlShowing事件進行處理:

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (e.Control is TextBox) 
    { 
    TextBox box = e.Control as TextBox; 
    box.AutoCompleteCustomSource = new AutoCompleteStringCollection(); 
    box.AutoCompleteCustomSource.AddRange(new string[] { "Foo", "Bar", "Baz" }); 
    box.AutoCompleteMode = AutoCompleteMode.Suggest; 
    box.AutoCompleteSource = AutoCompleteSource.CustomSource; 
    } 
} 

AutoCompleteDGV

考慮,用戶必須對任何選項,以顯示輸入文字。如果所需的行爲需要在輸入文本框時顯示所有選項,則這不是您的最佳選擇。但是,如果這是所有其他所需行爲(建議選項,接受非選項條目,並不總是必須顯示等)的次要條件,則這是一個可行的解決方案。

編輯

這個工作在所有的下列情況:

  1. 的DataGridView是數據綁定。

綁定數據源:

public BindingList<Example> Examples { get; set; } 

this.Examples = new BindingList<Example>(); 
dataGridView1.DataSource = this.Examples; 

在哪裏實施例是一個簡單的類:

public class Example 
{ 
    public string First { get; set; } 
    public string Last { get; set; } 
    public string Test { get; set; } 
} 
  • 手動添加柱(一個或多個)。
  • 僅有空柱:

    DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn(); 
    col.Name = "Extra"; 
    col.HeaderText = "Extra"; 
    this.dataGridView1.Columns.Add(col); 
    
  • 1和2都結合。
  • +0

    這看起來真棒,我從來沒有想到這一點!我完全實現了你所做的,但我無法讓下拉菜單出現。我需要更改DGV上的某些設置,還是需要更改列? – Tizz 2015-02-06 02:55:16

    +0

    @Tizz你有沒有設置一個斷點來確保這段代碼正在運行?另外,爲了澄清,即使你開始在文本框中輸入一個常用選項,該建議不會出現?如果對兩者都是,那麼我需要查看關於如何設置dgv的代碼和/或可能已添加到「EditControlShowing」中的任何其他邏輯。我嘗試了幾種方法,一切都奏效了。有關詳細信息,請參閱我答案中的編輯。 – OhBeWise 2015-02-06 16:50:36

    1

    剛剛成立的細胞,你想成爲一個ComboBox到的DataGridViewComboBoxCell類型:

    var cb1 = new DataGridViewComboBoxCell(); 
    cb1.Items.Add("Yes"); 
    cb1.Items.Add("No"); 
    dgv.Rows[1].Cells[1] = cb1; 
    
    var cb2 = new DataGridViewComboBoxCell(); 
    cb2.Items.Add("Blue"); 
    cb2.Items.Add("Red"); 
    dgv.Rows[3].Cells[1] = cb2; 
    

    然後使用EditingControlShowing事件改變下拉的風格讓編輯:

    void dgv_EditingControlShowing(object sender, 
               DataGridViewEditingControlShowingEventArgs e) { 
        ComboBox cb = e.Control as ComboBox; 
        if (cb != null) { 
        cb.DropDownStyle = ComboBoxStyle.DropDown; 
        } 
    } 
    

    使用CellValidating事件將任何輸入的項目添加到列表中,但這些項目尚不存在:

    void dgv_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { 
        var cb = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell; 
        if (cb != null && !cb.Items.Contains(e.FormattedValue)) { 
        cb.Items.Add(e.FormattedValue); 
        if (dgv.IsCurrentCellDirty) { 
         dgv.CommitEdit(DataGridViewDataErrorContexts.Commit); 
        } 
        dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue; 
        } 
    }