如何在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上放置一个组合框以编程方式迭代一个集合的主要内容,如果未能解决你的问题,请参考以下文章