我有一个带TextBoxColumn的DataGridView。我希望能够单击单元格进入编辑模式,当我执行下拉菜单时会出现用户选择的选项,或者如果用户不想要其中一个选项,他们可以编辑细胞(好像没有下降)。然后,当用户离开单元格时,将保存值(他们输入的内容或他们选择的内容)。
将用户输入的选项添加到下拉列表有很多答案,但这不是我想要的。我只是希望有一些常见的选项供用户在他们自行选择之前考虑。
我不希望有一个按钮来弹出另一个输入对话框。我不想将列引用到ComboBoxColumn。我不关心是否始终显示下拉箭头。
我试图在EditingContolShowing上将TextBoxCell更改为ComboBoxCell,但事实证明这是毫无意义的努力。
对此有什么建议吗?
答案 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;
}
}
鉴于,用户必须输入要显示的任何选项的文本。如果所需行为要求在进入文本框时显示所有选项,则这不是您的最佳选择。但如果这是所有其他所需行为的次要因素(建议选项,接受非选项,并不总是必须显示等),这是一个可行的解决方案。
修改强>
这适用于以下所有情况:
绑定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; }
}
只是一个空栏:
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn();
col.Name = "Extra";
col.HeaderText = "Extra";
this.dataGridView1.Columns.Add(col);
答案 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;
}
}