DataGridViewComboBoxCell编辑字段

时间:2016-03-11 11:13:54

标签: c# datagridview

我有一个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”。

关键在于输入是一个无选择的数字或预定义的字符串。

3 个答案:

答案 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设置值成员和显示成员