0

我已经检查了其他帖子,但仍然无法修复我的问题:我有两种形式:

  • 创建客户的一种(可以有多个电话、地址和汽车)
  • 应显示每个客户信息的主窗体。

在此处输入图像描述

首先,是否有可能在每一行都有一个客户,以及每个客户信息的三个组合(电话、地址和汽车)?

例如:

我有两个客户,John 和 Jack,我希望行显示如下:

0 - John - John.Phones - John.Addresses - John.Cars
1 - Jack - Jack.Phones - Jack.Addresses - Jack.Cars

另外,我不知道我应该将什么作为组合框的参数传递给我的行,我应该传递数据源、项目还是组合本身?无论我为组合框传递什么,我都会得到: 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);
    }
}

4

2 回答 2

1

您可以为每个客户创建一行,其中包含两种类型的单元格:文本框单元格和组合框单元格。考虑以下 :

 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.aspxhttp://msdn.microsoft.com/en-us/library/system.collections.ilist(v=vs.110).aspx 希望这有帮助!

于 2013-11-07T10:14:32.853 回答
1

关于你的第一个问题。当然可以。您可以查看此处,或查看带有该标签的任何其他 StackOverflow。

真正的问题是如何。大多数帖子都与 WPF 相关,在这种情况下,绑定会有所帮助,但我强烈建议阅读此人的博客,其中他有一个示例,其中包含类似结果的代码。

苏尔特 :)

编辑:
您的DataGridViewComboBoxCell来源应该是一个IListIListSource包含用于向下拉列表提供数据的值的集合(如果您不相信我,请看这里)。

因此,您的每个对象都应该有一个属性,该属性是 aList或任何您想要的满足IList接口的属性,并且您应该将其绑定到您的源。

因此,例如,如果以下类是您的对象,您应该将该对象绑定到行,但特别是 BindToThis1 (&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" };
    }
}
于 2013-11-07T03:20:59.503 回答