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