DataGridComboBoxColumn显示CellEnter的第一个值

时间:2013-04-22 18:01:01

标签: c# winforms visual-studio-2010 datagridview datagridviewcombobox

我在DataGridViewComboBoxColumn中遇到了奇怪的结果。

1)当没有设置值时,我单击单元格(而不是下拉箭头),选项中的第一个值显示为值,当我单击单元格时,它返回空白值。这是误导性的,因为没有选择任何值,但它会显示第一个值,直到您单击该单元格。

一个解决方案是将第一个选项留空,然而我仍然受到下一个问题的影响......

2)如果我选择已有值的单元格,然后选择不具有值的单元格,则最初选择的值将显示在未选择值的单元格中。再次,单击单元格将清除它,但是,它再次产生误导。

我想这样做不会产生误导......任何人都知道解决方案吗?

DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn(); 

DataTable dt = new DataTable();
dt.Columns.Add("f_Id");
dt.Columns[0].DataType = typeof(string);
dt.Columns.Add("f_Desc");
dt.Columns[1].DataType = typeof(string);

for (int i = 0; i < values.Count(); i++)
{
    dt.Rows.Add(values[i], values[i]);
}

col.DataSource = dt;
col.DisplayMember = dt.Columns[1].ColumnName;
col.ValueMember = dt.Columns[0].ColumnName;
col.HeaderText = header;
col.Name = header;

DataGridView1.Columns.Add(col);

2 个答案:

答案 0 :(得分:1)

我也在寻找这个,最后解决了这个问题。 创建DatagridView的以下事件,并将[comboboxcolumnNo]设置为datagridcomboboxcolumn编号。

现在每当组合框列聚焦进行编辑时,它将检查当前单元格值是否为空,如果为空,则显示组合框的-1索引,但不显示任何内容。

    private void datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (datagridview1.CurrentCell.ColumnIndex == comboboxcolumnNo && e.Control is ComboBox)
        {
            ComboBox comboBox = (ComboBox)e.Control;
            if (datagridview1.CurrentCell.Value == null)
            {
                comboBox.SelectedIndex = -1;
            }
        }
    }

答案 1 :(得分:1)

这一直困扰着我一段时间,Zeeshanef的代码帮助但仍然没有完全解决它。经过进一步调查,我发现如果使用DefaultValuesNeeded方法设置一些默认值,可能会设置单元格值,但在EditingControlShowing方法中显示的组合框控件具有空值/文本。我通过调整代码来解决它:

private void datagridview1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is ComboBox)                
        {
            ComboBox comboBox = (ComboBox)e.Control;
            if (datagridview1.CurrentCell.Value == null
                || string.IsNullOrEmpty(datagridview1.CurrentCell.Value.ToString())
                || string.IsNullOrEmpty(comboBox.SelectedText)
                )
            {
                comboBox.SelectedIndex = -1;
            }               
        }
    }