2016-03-29 4 views
0

У меня есть класс со следующими свойствами:Bind DataGridViewComboBoxColumn к вложенному списку

Public string Name { get; set; } 
Public string LastName { get; set; } 
Public List<string> Jobs{ get; set; } 

Свойства Name и LastName связаны с DataGridView, в то время как мне нужно, чтобы связать Jobs к ComboBox внутри DataGridView.

  • Если человек имеет 1 работу в ComboBox он должен появиться только с номером 1.
  • Если человек имеет 2 рабочих мест должно появиться с 1 и 2 при нажатии на ComboBox.

Например:

John Smith 1 
Paul Mayer 1 
      2 

Вот как я добавив ComboBoxColumn:

private void AddComboBox() 
{ 
    DataGridViewComboBoxColumn Jobs = new DataGridViewComboBoxColumn(); 
    foreach (var item in People) 
    { 
     for (int i = 0; i < item.Jobs.Count; i++) 
     { 
      Jobs.Items.Add(item.Jobs[i]); 
     } 
    } 
} 

Но этот код делает каждый ComboBox то же самое, так что вместо того, чтобы 1 в первом и 1-2 во втором ComboBox, я получаю 1-1-2 для каждого ComboBox.

Есть ли способ получить текущий ComboBox для добавления элементов? К сожалению, поскольку это ComboBoxColumn, у меня нет свойства Rows[i], подобного ячейкам.

Я также пробовал с привязкой данных, но Jobs - это список, поэтому DataPropertyName вызывает ошибку из-за преобразования из списка в строку.

Спасибо всем.

+0

Не могли бы вы опубликовать свой код, где связывание данных происходит? – A3006

ответ

0

Вы можете использовать привязку данных путем поиска каждого ComboBox после того, как DataGridView завершил собственное связывание источника.

  1. Удалить AddComboBox полностью, вам это не понадобится.
  2. Добавьте следующий обработчик события, dataGridViewJobs.DataBindingComplete += DataGridViewJobs_DataBindingComplete; и в нем источник каждого DataGridViewComboBoxCell:

    private void DataGridViewJobs_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
    { 
        string colName = "Jobs"; 
    
        if (dataGridViewJobs.Columns.Contains(colName)) 
        { 
         dataGridViewJobs.Columns.Remove(colName); 
        } 
    
        DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn(); 
        column.Name = colName; 
        dataGridViewJobs.Columns.Add(column); 
    
        foreach (DataGridViewRow row in dataGridViewJobs.Rows) 
        { 
         var person = (Person)row.DataBoundItem; 
         var cell = row.Cells[colName] as DataGridViewComboBoxCell; 
    
         cell.DataSource = person.Jobs; 
         cell.Value = person.Jobs[0]; 
        } 
    } 
    
Смежные вопросы