Como alterar o estilo de caixa de combinação da célula em DataGridViewComboBoxColumn

Células em DataGridViewComboBoxColumn têm DropDownList ComboBoxStyle. Isso significa que o usuário só pode selecionar valores no menu suspenso. O controle subjacente é ComboBox, portanto, pode ter o estilo DropDown. Como faço para alterar o estilo da caixa de combinação subjacente em DataGridViewComboBoxColumn. Ou, mais geral, posso ter uma coluna no menu suspenso DataGridView com onde o usuário pode digitar?

7

3 Respostas

void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e)
{
    if (e.Control.GetType() == typeof(DataGridViewComboBoxEditingControl))
    {
        DataGridViewComboBoxEditingControl cbo = 
            e.Control as DataGridViewComboBoxEditingControl;
        cbo.DropDownStyle = ComboBoxStyle.DropDown;
    }
}

Problem with combobox and databound datagridview

4
adicionado
Esta é apenas uma ideia da solução. Solução completa requer rotina de validação, caso contrário o DataGridView lançará uma exceção. A solução útil também geralmente requer uma lista específica de células no menu suspenso.
adicionado o autor chgman, fonte

A solução a seguir funciona para mim

private void dataGridView1_CellValidating(object sender, 
    DataGridViewCellValidatingEventArgs e) 
{
    if (e.ColumnIndex == Column1.Index) 
    {
       //Add the value to column's Items to pass validation
        if (!Column1.Items.Contains(e.FormattedValue.ToString())) 
        {
            Column1.Items.Add(e.FormattedValue);
            dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = 
                e.FormattedValue;
        }
    }
}

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e) 
{
    if (dataGridView1.CurrentCell.ColumnIndex == Column1.Index) 
    {
        ComboBox cb = (ComboBox)e.Control;
        if (cb != null) 
        {
            cb.Items.Clear();
           //Customize content of the dropdown list
            cb.Items.AddRange(appropriateCollectionOfStrings);
            cb.DropDownStyle = ComboBoxStyle.DropDown;
        }
    }
}
2
adicionado
o dado se condição sempre acaba por ser verdade no meu combobox com base em dados ... existe um trabalho em torno de ... dada condição: ====================== ================== & zwnj; ======= if ( ! Column1.Items.Contains (e.FormattedValue.ToString ())) {Column1.Items.Add (e.FormattedValue); dataGridView1.Rows [e.RowIndex] .Cells [e.ColumnIndex] .Value = e.FormattedValue; }
adicionado o autor Asad Malik, fonte
if (!Column1.Items.Contains(e.FormattedValue.ToString())) { 
    Column1.Items.Add(e.FormattedValue);     
    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue; 
}  

pode sempre retornar verdade porque Column1.Items.Contains() está procurando pouvalores String . Se e.FormattedValue não fouuma String , a comparação falhará.

experimentar

if (!Column1.Items.Contains(e.FormattedValue.ToString())) { 
    Column1.Items.Add(e.FormattedValue.ToString());     
    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue.ToString(); 
}

ou

if (!Column1.Items.Contains(e.FormattedValue)) { 
    Column1.Items.Add(e.FormattedValue); 
    dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = e.FormattedValue; 
}
1
adicionado