Question

Alors, je DataGridView en utilisant comme source de données un BindingList

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

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

avec

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

et j'utilise une colonne COMBOBOX:

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

Comment puis-je obtenir ce travail?! Maintenant, je reçois une exception parce que je pense qu'il essaie de jeter l'ID à colorName.

J'ai essayé avec un vide ValueMember ou l'ajout d'un opérateur coulé directement à la classe colorName mais ne peut pas le faire fonctionner.

Bien sûr, je peux utiliser un int dans la classe de voiture pour représenter la couleur mais pas aussi agréable.

Comme vous l'aurez deviné ces classes sont en fait du projet Château ActiveRecord-s.

Toutes les idées sont les bienvenues!

Était-ce utile?

La solution

Avez-vous essayé ValueMember = "" ou ValueMember = ""?

Vraiment hacky, mais vous pouvez ajouter une propriété sur elle-même est que ColorName? (Peut-être via une classe partielle)

public ColorName Self {get {return this;}}

set alors `ValueMember = "auto";

En dehors de cela, vous auriez probablement besoin d'un TypeConverter

L'autre option pourrait être de passer outre sur ToString() pour revenir Name DisplayMember, et ne pas avoir un membre valeur / affichage?


(mise à jour: il ne fait pas)

La vérification effectuée, et semble fonctionner ValueMember:

public override string ToString() { return Name; }

et juste ne définissez pas <=> ou a <=>.


connaissez bien whad'ya - le truc "Self" fonctionne aussi ...

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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top