【问题标题】:How to put a combobox on datagridview programmatically iterating a Collection如何在datagridview上放置一个组合框以编程方式迭代一个集合
【发布时间】: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, ... ); 的末尾,但没有成功。我在哪里犯错了吗? ?

【问题讨论】:

    标签: c# winforms datagridview combobox


    【解决方案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++;
      }
    }
    

    【讨论】:

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