C#DataGridView DataGridViewTextCell到DataGridViewComboBoxCell可编辑文本

时间:2015-02-05 17:24:04

标签: c# datagridview datagridviewcomboboxcell datagridviewtextboxcell

我有一个带TextBoxColumn的DataGridView。我希望能够单击单元格进入编辑模式,当我执行下拉菜单时会出现用户选择的选项,或者如果用户不想要其中一个选项,他们可以编辑细胞(好像没有下降)。然后,当用户离开单元格时,将保存值(他们输入的内容或他们选择的内容)。

将用户输入的选项添加到下拉列表有很多答案,但这不是我想要的。我只是希望有一些常见的选项供用户在他们自行选择之前考虑。

我不希望有一个按钮来弹出另一个输入对话框。我不想将列引用到ComboBoxColumn。我不关心是否始终显示下拉箭头。

我试图在EditingContolShowing上将TextBoxCell更改为ComboBoxCell,但事实证明这是毫无意义的努力。

对此有什么建议吗?

2 个答案:

答案 0 :(得分: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是数据绑定。
  2. 绑定DataSource:

    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; }
    }
    
    1. 手动添加列。
    2. 只是一个空栏:

      DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
      col.Name = "Extra";
      col.HeaderText = "Extra";
      this.dataGridView1.Columns.Add(col);
      
      1. 1和2合并。

答案 1 :(得分: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事件更改DropDown的样式以允许编辑:

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