2008-12-12 1 views
2

Итак, у меня есть DataGridView, используя в качестве источника данных в BindingListDataGridView, BindingList <T>, DataGridViewComboBoxColumn

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

Где

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

с

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

и я использую столбец COMBOBOX:

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

Как я могу заставить это работать?! Теперь я получаю исключение, потому что я думаю, что он пытается передать Id в ColorName.

Я пробовал с пустым ValueMember или добавлял оператор прямого трансляции к классу ColorName, но не мог заставить его работать.

Конечно, я могу использовать int в классе Car для представления цвета, но не так хорошо.

Как вы, наверное, догадались, что эти классы на самом деле являются Замок проекта ActiveRecord-s.

Любые идеи приветствуются!

ответ

5

Вы попробовали ValueMember = "" или ValueMember = "."?

Действительно хакеры, но вы можете добавить свой объект на ColorName, что само по себе? (возможно, через частичный класс)

public ColorName Self {get {return this;}} 

затем установить `ValueMember =" Self "; '

Кроме этого, вы, вероятно, нужен TypeConverter

Другой вариант может переопределить ToString() на ColorName вернуть Name, а не элемент значение/дисплей?


(обновление: нет, это не делает)

Проверили, и ToString(), кажется, работает:

public override string ToString() { return Name; } 

и просто не установить DisplayMemberили в ValueMember ,


Ну whad'ya ноу - трюк "Я" тоже работает ...

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); 
     } 
    } 
} 
Смежные вопросы