Как получить ссылку на базовый объект в привязанном DataGridViewComboBoxCell? - PullRequest
1 голос
/ 05 февраля 2009

Я не знаю, не работает ли мой разум сегодня или это на самом деле тяжелее, чем я думаю, должно быть.

У меня есть DataGridView с DataGridViewComboBoxColumn, привязанным к универсальному списку объектов CustomObjects. Вот пример грубого кода, как я настраиваю столбец.

DataGridViewComboBoxColumn location = new DataGridViewComboBoxColumn() 
{
    Name = "Location",
    DataSource = new BindingSource(GetMyLocations(), null),
    DisplayMember = "Name",
    ValueMember = "ID"
};

Тогда, когда я хочу вернуть значение ячейки:

string id = (string)row.Cells["Location"].Value;

Но мне не нужна ссылка на свойство ID, я хочу ссылку на фактический объект Location! Я пытался не указывать ValueMember, но, похоже, просто использовать DisplayMember.

Я мог бы перебрать все объекты Location в столбце DataSource и проверить наличие соответствующего свойства ID, однако, похоже, что ComboBoxCell должен иметь возможность возвращать это напрямую.

Кроме того, я не могу использовать словарь в этом случае.

Есть идеи, как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 05 февраля 2009

Вы можете использовать IList из KeyValuePair с «Имя» и ваш пользовательский объект. Идея в том, что вам нужно ValueMember, чтобы указать на ссылку вашего объекта. Я помню, что у меня были похожие проблемы с ComboBox es.

Что-то вроде следующего должно сделать трюк (с макушки головы и без проверки):

IList<KeyValuePair<String,MyObject>> comboData = 
    new IList<KeyValuePair<String,MyObject>>();

foreach(var o in GetMyLocations())
    comboData.Add(new KeyValuePair<String,MyObject>(o.Name, o));

DataGridViewComboBoxColumn location = new DataGridViewComboBoxColumn()
{
    Name = "Location",
    DataSource = comboData,
    DisplayMember = "Key",
    ValueMember = "Value"
};

Возможно, вы захотите изменить GetMyLocations(), чтобы вместо него вернуть список KeyValuePair, чтобы вы не заполняли два списка без причины.

0 голосов
/ 25 января 2017
public class Thing
{
    public string id{  get ;  set ; }
    public string Name  {  get ;  set ; }

    //self ref
    public Thing This
    {
        get { return this; }
    }
}



form_load(){
      comboboxcell.ValueMember = "This";  // self ref
      comboboxcell.DisplayMember = "Name";
}


 datagridview1.CellValueChanged += (s, e) => {
    var cb = (DataGridViewComboBoxCell)dgv_titles.Rows[e.RowIndex].Cells[e.ColumnIndex];
   var selectedObject  = (Thing)cb.Value  ;
}

Это самый простой и чистый способ, с которым я столкнулся.

http://mikehadlow.blogspot.com/2006/09/problems-with-datagridviewcomboboxcolu.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...