2017-07-08 52 views
0

使用C#,用的EntityFramework和codefirst,我有我的模型层后续类:如何把在datagridview的组合框编程迭代集合

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和填充列。问题是当我在行的末尾添加电话组合框时。程序编译,但是当负载形式,组合框不monted及以下异常显示信息:System.ArgumentException:的的DataGridViewComboBoxCell无效

inserir a descrição da imagem aqui

如果我不把DataGridViewComboBoxCell行是安装,但组合框不显示电话。也尝试创建一个组合框,并在dataGridViewClientes.Rows.Add(c.Nome, c.Email, c.DataCadastro, ...);结束时添加它,但取得成功。我犯了什么错误? ? inserir a descrição da imagem aqui

回答

1

我相信这个问题是从线...

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

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

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

帮助,行索引curRow是用来保持每个客户的轨迹,每行一个。下面的代码演示了我上面的评论。我将下面的行添加到电话列属性以允许“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++; 
    } 
} 
+0

谢谢。我遵循他们的建议,一切都按我的预期工作。我也在葡萄牙语中引用了您在Stackoverflow中的答案的链接,但是您可以阅读源代码:)(https://pt.stackoverflow.com/questions/218925/colocar-uma-combobox-numa-coluna-de-um -datagridview/219066#219066)所以其他同事可以分享你的答案。在那里你还可以看到最终的代码是如何的。再一次,谢谢。 – Emerson

+0

@ Emerson ...很高兴帮助,我理解你的挫败感,'DataGridViewComboBoxCell'有时可以忍受。祝你好运! – JohnG