2014-10-20 4 views
0

В моем Winform приложении есть DataGrid и вставить значение из DataGrid Я генерирующего выпадающие списки для некоторых столбцов, используя следующий код внутри события нажатия кнопки:C# выпадающий в DataGridView

dgvLoadTable.DataSource = source; 
dgvLoadTable.ReadOnly = false; 
dgvLoadTable.AllowUserToAddRows = true; 

var practices = (from p in context.TOWERIMPORTCLIENTs select p.PRACTICE).Distinct(); 
for(int r= 0; r < dgvLoadTable.Rows.Count; r++) 
{ 
for(int c = 0; c < dgvLoadTable.Columns.Count; c++) 
{ 
    if(c == 2 || c == 4) 
    { 
     this.dgvLoadTable[c, r] = new DataGridViewComboBoxCell(); 
     foreach(var name in practices) 
      ((DataGridViewComboBoxCell)dgvLoadTable[c, r]).Items 
                  .AddRange(practices.ToArray()); 
    } 
    } 
} 

Это работает для только первая новая строка, когда генерируется вторая новая строка, у нее нет comboboxes. Итак, как определить, генерируется ли новая строка?

+0

какой объект является «источником»? –

+0

источник - это модель сущности – feather

ответ

1

Вы можете сделать это, используя код вообще. Используйте конструктор, чтобы добавить DataGridViewComboBoxColumn к вашему datagrid. Свяжите этот столбец с BindingSource (установите свойство источника данных), которое связывается с вашим List<Practice> и соответствующим образом отображает DisplayMember и ValueMember.

Например:

  • Ваш DataPropertyName будет: (? Это строка ...) Практика
  • Ваш источник данных будет какая-то BindingSource PracticesBindingSource (см код ниже)
  • Ваш DisplayMember будет быть ПРАКТИКА (строка)
  • Ваш ValueMember будет ПРАКТИКА (не уверен в этом)

Property overview of 'Edit Columns'

Связывание вашего PracticesBindingSource было бы очень просто:

public void BindPractices(DbContext context) 
{ 
    PracticesBindingSource.DataSource = (
     from p in context.TOWERIMPORTCLIENTs 
     select p.PRACTICE 
     ).Distinct().ToArray(); 
} 

Поскольку вы проектировали свой интерфейс, как это, ваш DataGridView будет вести себя так же для каждой строки он показывает.

Вы можете добавить DataGridViewComboBoxColumn в код, если хотите.

public void AddDataGridViewComboBoxColumn(DataGridView dgv, string propertyoBindTo) 
{ 
    var dc = new DataGridViewComboBoxColumn(); 
    dc.DataSource = this.practicesBindingSource; 
    dc.DisplayMember = "PRACTICE"; 
    dc.ValueMember = "PRACTICE"; 
    dc.DataPropertyName = propertyToBindTo; 
    dgv.Columns.Add(dc); 
} 
+0

Я не могу этого сделать, у меня 11 таблиц, и каждая структура таблицы отличается. Поэтому я должен создавать столбцы combobox во время выполнения с кодом. – feather

+0

Вы не создаете comboboxcolumn .... вы создаете ячейку combobox .... См. Мое редактирование –

+0

Создал ли столбец код? Если нет, то какие проблемы вы все еще испытываете? И если бы вы могли пометить мой ответ как «Ответ», спасибо! –

Смежные вопросы