Pregunta

Por lo tanto, tengo un DataGridView utilizando como fuente de datos una BindingList

DataGridView.DataSource = new  BindingList<Car>{...}

Donde

public class Car
{
    public ColorName Color { get; set;}
}

con

public class ColorName
{
    public int Id {get; set;}
    public string Name{get; set;}
}

y utilizo una columna Combobox:

DataGridViewComboBoxColumn colorNameDataGridViewTextBoxColumn;
colorNameDataGridViewTextBoxColumn.DataPropertyName = "Color";
colorNameDataGridViewTextBoxColumn.HeaderText = "Color";
colorNameDataGridViewTextBoxColumn.Name = "Color";
colorNameDataGridViewTextBoxColumn.DisplayMember = "Name";
colorNameDataGridViewTextBoxColumn.ValueMember = "Id";
colorNameDataGridViewTextBoxColumn.DataSource = new ColorName[] {...};

¿Cómo puedo conseguir que esto funcione?! Ahora consigo una excepción porque creo que intenta emitir el Id a Colorname.

He intentado con un ValueMember vacío o la adición de un operador de conversión directa a la clase Colorname pero no puedo conseguir que funcione.

Claro que puedo utilizar un int en la clase de coches para representar el color pero no es tan agradable.

Como habrá adivinado esas clases son en realidad Proyecto Castillo ActiveRecord-s.

Todas las ideas son bienvenidas!

¿Fue útil?

Solución

¿Usted intentó ValueMember = "" o ValueMember = ""?

Realmente hacky, pero se podría añadir una propiedad en ColorName que es en sí misma? (Quizás a través de una clase parcial)

public ColorName Self {get {return this;}}

a continuación, establecer `ValueMember = "Ser"; '

Aparte de eso, lo que probablemente necesita un TypeConverter

La otra opción podría ser la de anular ToString() en Name para volver DisplayMember, y no tener un miembro de valor / pantalla?


(actualización: No, no)

Han comprobado, y ValueMember parece que funciona:

public override string ToString() { return Name; }

y simplemente no establezca un <=> o a <=>.


conocer bien whad'ya - el truco "Auto" funciona también ...

using System;
using System.ComponentModel;
using System.Windows.Forms;
class ColorName
{
    public ColorName(int id, string name) {
        this.Id = id;
        this.Name = name;
    }
    public int Id { get; private set; }
    public string Name { get; private set; }

    // maybe declare this one in a partial class...
    public ColorName Self { get { return this; } }
}
class Car
{
    public ColorName Color { get; set; }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        using(Form form = new Form())
        using (DataGridView grid = new DataGridView())
        {
            grid.Dock = DockStyle.Fill;
            grid.AutoGenerateColumns = false;
            ColorName[] colors = new[] {
              new ColorName(1,"Red"),
              new ColorName(2,"Blue"),
              new ColorName(3,"Green")
            };
            var col = new DataGridViewComboBoxColumn
            {
                DataPropertyName = "Color",
                HeaderText = "Color",
                Name = "Color",
                DisplayMember = "Name",
                ValueMember = "Self",
                DataSource = colors
            };

            grid.Columns.Add(col);
            grid.DataSource = new BindingList<Car> {
                new Car { Color = colors[0]}
            };
            form.Controls.Add(grid);
            Application.Run(form);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top