如何在datagridview上放置一个组合框以编程方式迭代一个集合

Posted

技术标签:

【中文标题】如何在datagridview上放置一个组合框以编程方式迭代一个集合【英文标题】:How to put a combobox on datagridview programmatically iterating a Collection 【发布时间】:2017-07-08 12:06:33 【问题描述】:

使用 C#、EntityFramework 和 codefirst,我在模型层上有以下类:

public class Cliente

    public int ClienteId  get; set; 
    public string Nome  get; set; 
    public string Email  get; set; 
    public DateTime DataCadastro  get; set; 
    public bool Ativo  get; set; 

    public virtual ICollection<Endereco> Enderecos  get; set; 
    public virtual ICollection<Telefone> Telefones  get; set; 


    public class Endereco
    
        public int EnderecoId  get; set; 
        public string Cep  get; set; 
        public string Rua  get; set; 
        public string Numero  get; set; 
        public string Complemento  get; set; 
        public string Bairro  get; set; 
        public string Cidade  get; set; 
        public string Estado  get; set; 
        public decimal TaxaDeEntrega  get; set; 

        public int ClienteId  get; set; 
        public virtual  Cliente Cliente  get; set; 
    

    public class Telefone
    
        public int TelefoneId  get; set; 
        public string Numero  get; set; 
        public int ClienteID  get; set; 

        public virtual Cliente Cliente  get; set; 
    

在我的表单中,我有一个带有 datagridview 的表单,其中包含客户名称、电子邮件、日期和一个组合框,其中包含每个客户的电话列表,每个客户可以拥有多个电话。这些配置是这样安装的:

private void FormClientes_Load(object sender, EventArgs e)
        
            this.FormBorderStyle = FormBorderStyle.None;
            this.ControlBox = false;
            this.MaximizeBox = false;
            this.MinimizeBox = false;
            this.ShowIcon = false;
            this.Dock = DockStyle.Fill;

            dataGridViewClientes.AutoGenerateColumns = false;
            dataGridViewClientes.RowHeadersVisible = false;//Omite a primeira coluna

            DataGridViewTextBoxColumn colNome = new DataGridViewTextBoxColumn();
            colNome.HeaderText = "NOME";
            colNome.DataPropertyName = "Nome";
            dataGridViewClientes.Columns.Add(colNome);

            DataGridViewTextBoxColumn colEmail = new DataGridViewTextBoxColumn();
            colEmail.HeaderText = "EMAIL";
            colEmail.DataPropertyName = "Email";
            dataGridViewClientes.Columns.Add(colEmail);

            DataGridViewTextBoxColumn colDataCadastro = new DataGridViewTextBoxColumn();
            colDataCadastro.HeaderText = "DATA CADASTRO";
            colDataCadastro.DataPropertyName = "DataCadastro";
            dataGridViewClientes.Columns.Add(colDataCadastro);

            DataGridViewComboBoxColumn colTelefones = new DataGridViewComboBoxColumn();
            colTelefones.HeaderText = "TELEFONES";
            colTelefones.DataPropertyName = "Numero";
            dataGridViewClientes.Columns.Add(colTelefones);

            FillDataGrid();
        

        private void FillDataGrid()
        
            foreach (var c in _clienteApp.GetAll())
            
                DataGridViewComboBoxCell cbc = new DataGridViewComboBoxCell();

                foreach (var t in c.Telefones)
                
                    cbc.Items.Add(t.Numero);
                

                dataGridViewClientes.Rows.Add(c.Nome, c.Email, c.DataCadastro, cbc);
            
        

FillDataGrid() 方法我获取 BD 数据并填充列。问题是当我在行尾添加电话组合框时。程序编译,但加载表单时,组合框没有被蒙上,并显示以下异常: System.ArgumentException: The DataGridViewComboboxCell is not valid

如果我不把DataGridViewComboBoxCell 行挂载,但组合框不显示电话。还尝试创建一个组合框并将其添加到dataGridViewClientes.Rows.Add(c.Nome, c.Email, c.DataCadastro, ... ); 的末尾,但没有成功。我在哪里犯错了吗? ?

【问题讨论】:

【参考方案1】:

我相信问题出在这条线上……

dataGridViewClientes.Rows.Add(c.Nome, c.Email, c.DataCadastro, cbc);

以这种方式添加组合框单元格似乎会引发此错误。一种解决方法是手动设置单元格。它是一个组合框列,所以它应该是有效的。

dataGridViewClientes.Rows[curRow].Cells["Numero"] = cbc;

为了提供帮助,行索引curRow 用于跟踪每个客户端,每行一个。下面的代码演示了我上面的 cmets。我将下面的行添加到电话列属性中以允许“Numero”引用

colTelefones.Name = "Numero";

希望这会有所帮助。

private void FillDataGrid() 
  int curRow = 0;
  foreach (var c in _clienteApp.GetAll()) 
    DataGridViewComboBoxCell cbc = new DataGridViewComboBoxCell();

    foreach (var t in c.Telefones) 
      cbc.Items.Add(t.Numero);
    

    dataGridViewClientes.Rows.Add(c.Nome, c.Email, c.DataCadastro);
    dataGridViewClientes.Rows[curRow].Cells["Numero"] = cbc;
    curRow++;
  

【讨论】:

谢谢。我听从了他们的建议,一切都按我的预期进行。我还在葡萄牙语的 *** 中引用了您的答案链接,但您可以阅读源代码:) (pt.***.com/questions/218925/…),以便其他同事可以分享您的答案。在那里你还可以看到最终的代码是怎样的。再来一次,谢谢。 @Emerson... 很高兴为您提供帮助,我理解您的沮丧,DataGridViewComboBoxCell 有时可以承受。祝你好运!

以上是关于如何在datagridview上放置一个组合框以编程方式迭代一个集合的主要内容,如果未能解决你的问题,请参考以下文章

更改 WPF 组合框以对鼠标按下做出反应

Excel VBA文本框以填充组合框

如何根据组合框选择过滤datagridview

如何将 DataGridView 组合框添加到绑定的 DataGridView 数据源(以编程方式)

组合选项框和组合框以将记录添加到右表

如何在datagridview组合框列中绑定数据