我已经检查了其他帖子,但仍然无法修复我的探测: 我有两种形式:
首先,是否可以在每一行中拥有一个客户端,以及三个组合(电话,地址和汽车)以及每个客户信息?
例如:
我有两个客户,约翰和杰克,我希望这些行显示如下:
0 - John - John.Phones - John.Addresses - John.Cars
1 - Jack - Jack.Phones - Jack.Addresses - Jack.Cars
另外,我不知道如果我传递dataSource,Items或组合本身,我应该将什么作为组合框的参数传递给我的行?无论我通过组合框,我得到:
System.ArgumentException: DatagridViewRowComboBoxCell value is not valid
这是实际的代码。
private DataGridViewRow BuildRow(Cliente cliente)
{
DataGridViewRow row = new DataGridViewRow();
DataGridViewComboBoxCell Autos = new DataGridViewComboBoxCell();
Autos.DataSource = cliente.Autos;
Autos.ValueMember = cliente.Autos[0].ToString();
row.CreateCells(DGCliente, cliente.Codigo.ToString(), cliente.Nombre, Autos);
row.Tag = cliente;
DGCliente.Rows.Add(row);
return row;
}
客户端类代码:(西班牙语)
public class Cliente
{
public String Nombre { get; set; }
public Int32 Codigo { get; set; }
public List<Auto> Autos { get; set; }
public List<Direccion> Direcciones { get; set; }
public List<Telefono> Telefonos { get; set; }
public Cliente()
{
this.Direcciones = new List<Direccion>();
this.Telefonos = new List<Telefono>();
this.Autos = new List<Auto>();
}
public Cliente(String Nombre , Int32 Codigo)
{
this.Nombre = Nombre;
this.Codigo = Codigo;
this.Direcciones = new List<Direccion>();
this.Telefonos = new List<Telefono>();
this.Autos = new List<Auto>();
}
public void AgregarTelefono(bool esCelular, String numero, String area)
{
this.Telefonos.Add(new Telefono(esCelular, numero, area));
}
public void AgregarDireccion(string calle, string altura, string localidad, string provincia)
{
this.Direcciones.Add(new Direccion(calle, altura, localidad, provincia));
}
public void AgregarAuto(Auto auto)
{
this.Autos.Add(auto);
}
}
答案 0 :(得分:1)
关于你的第一个问题。当然可以。您可以查看here或任何其他具有该标记的StackOverflow。
真正的问题是如何。大多数帖子都与WPF相关,在这种情况下,绑定会有所帮助,但我强烈建议您阅读this guy's blog,其中有一个示例,其中包含类似结果的代码。
Suerte:)
修改强>
您的DataGridViewComboBoxCell
来源应为IList
或IListSource
,其中包含用于向下拉列表提供数据的值集合(如果您不相信,请查看here我)。
因此,你的每个对象都应该有一个属性List
或者你想要满足IList
接口的任何属性,你应该将它绑定到你的源。
因此,例如,如果下面的类是您的对象,则应该将该对象绑定到该行,但特别是将BindToThis1(&amp; 2)绑定到DataGridViewComboBoxCell源(就像他在dtTitles
示例中所做的那样)。
public class MyObject
{
public List<string> BindToThis1 { get; set; }
public List<string> BindToThis2 { get; set; }
public MyObject()
{
BindToThis1 = new List<string> { "hello", "world" };
BindToThis2 = new List<string> { "red", "blue", "green" };
}
}
答案 1 :(得分:1)
您可以为每个客户端创建一行,其中包含2种类型的单元格,一个文本框单元格和一个组合框单元格。 请考虑以下事项:
public class PersonRow : DataGridViewRow
{
public DataGridViewTextBoxCell Name;
public DataGridViewComboBoxCell Phones;
public DataGridViewComboBoxCell Cars;
public PersonRow(Person person)
{
Name.Value = person.Name;
DataGridViewComboBoxCell phones = new DataGridViewComboBoxCell();
phones.Items.AddRange((DataGridViewComboBoxCell.ObjectCollection)person.Phones); //add the items from Person.Phones to PersonRow.Phones combobox cell
Phones = phones;
DataGridViewComboBoxCell cars = new DataGridViewComboBoxCell();
cars.Items.AddRange((DataGridViewComboBoxCell.ObjectCollection)person.Cars); //add Person.Cars to PersonRow.Cars combobox cell
Cars = cars;
Cells.AddRange(new DataGridViewCell[] { Name, Phones, Cars }); //add cells to the row
}
}
public class Person
{
public string Name { get; set; }
public IList<Phones> Phones { get; set; } //be sure to use the IList interface
public IList<Cars> Cars { get; set; } //be sure to implement the IList interface
public Person( string name, List<Phones> phones, List<Cars> cars)
{
Name = name;
Phones = phones;
Cars = cars;
}
}
public class Phones
{
public string Name { get; set; }
public string Model { get; set; }
public Phones(string name, string model)
{
Name = name;
Model = model;
}
}
public class Cars
{
public string Name { get; set; }
public string Model { get; set; }
public Cars(string name, string model)
{
Name = name;
Model = model;
}
}
同时结帐:http://msdn.microsoft.com/en-us/library/bc3sctb6(v=vs.110).aspx 和http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.objectcollection.aspx和http://msdn.microsoft.com/en-us/library/system.collections.ilist(v=vs.110).aspx 希望这有帮助!