我有一个DataGridViewComboBoxCell
连接到字符串列表:
DataGridViewComboBoxCell cell = new DataGridViewComboBoxCell();
List<string> data = new List<string>() { "88","LinearCurve", "NonLinearCurve" };
cell.DataSource = data;
cell.ReadOnly = false;
cell.Value = data[0];
dataGridView1.Rows[0].Cells[0] = cell;
但是当我双击单元格时,是否可以在运行时编辑这些字段?
当选择“88”时,我应该能够双击并将文本更改为“89”。字符串列表数据现在应包含“89”,“LinearCurve”和“NonLinearCurve”。
关键在于输入是一个无选择的数字或预定义的字符串。
答案 0 :(得分:1)
为了编辑DataGridViewComboBoxCell
中的值,我们会处理以下事件:
this.dataGridView1.EditingControlShowing += DataGridView1_EditingControlShowing;
this.dataGridView1.CellValidating += DataGridView1_CellValidating;
this.dataGridView1.DataError += DataGridView1_DataError;
此外,为了使价值变更永久保留cell.Value
,我们会将您的设置更改为:
DataGridViewComboBoxCell cell = new DataGridViewComboBoxCell();
cell.Items.AddRange("88", "LinearCurve", "NonLinearCurve");
cell.Value = cell.Items[0];
cell.ReadOnly = false;
dataGridView1.Rows[0].Cells[0] = cell;
处理EditingControlShowing
我们的目的是在选择第一项(可编辑的数字)时将ComboBox.DropDownStyle
更改为DropDown
(可编辑),并DropDownList
(不可编辑) )否则:
private void DataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
if (this.dataGridView1.CurrentCell == this.dataGridView1[0,0])
{
ComboBox cb = e.Control as ComboBox;
if (cb != null)
{
cb.SelectedIndexChanged -= Cb_SelectedIndexChanged;
// Following line needed for initial setup.
cb.DropDownStyle = cb.SelectedIndex == 0 ? ComboBoxStyle.DropDown : ComboBoxStyle.DropDownList;
cb.SelectedIndexChanged += Cb_SelectedIndexChanged;
}
}
}
private void Cb_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cb = sender as ComboBox;
cb.DropDownStyle = cb.SelectedIndex == 0 ? ComboBoxStyle.DropDown : ComboBoxStyle.DropDownList;
}
处理CellValidating
我们的目的是将第一项的值更改为用户输入的值,如果该值不为空并且不在列表中。我们还需要提交编辑更改并设置cell.Value
:
private void DataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (e.ColumnIndex == 0 && e.RowIndex == 0)
{
var cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell;
if (cell != null && e.FormattedValue.ToString() != string.Empty && !cell.Items.Contains(e.FormattedValue))
{
cell.Items[0] = e.FormattedValue;
if (this.dataGridView1.IsCurrentCellDirty)
{
this.dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
cell.Value = e.FormattedValue;
}
}
}
最后,处理DataError
我们的目的是捕获在ComboBox.Items
中设置新值时抛出的错误。单元格会抱怨试图设置新值,但它仍然有效 - 所以可以忽略错误:
private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
if (e.ColumnIndex == 0 && e.RowIndex == 0)
{
e.Cancel = true;
}
}
旁注:
如果您选择了一个不可编辑的值并开始在单元格上键入,它将尝试选择匹配的值。例如,如果列表中的第一项是&#34; 88&#34;你已经拥有了&#34; LinearCurve&#34;选择,输入&#34; 8&#34;将自动选择&#34; 88&#34; - 第一项将强制可编辑模式。因此,它会显示,就像您已经开始编辑不可编辑的值一样,但事实并非如此。这只是ComboBox
的一个怪癖。
答案 1 :(得分:0)
如果您将单元格的ReadOnly属性设置为false,则会让您编辑该单元格的内容。
试试这个:
DataGridViewComboBoxCell cell = new DataGridViewComboBoxCell();
cell.ReadOnly = false;
答案 2 :(得分:0)
为comboboxcell设置值成员和显示成员