2012-02-26 2 views
2

В настоящее время у меня есть DataGridView с шириной в 2 столбца, первый столбец - DataGridViewTextBoxColumn, а второй - DataGridViewComboBoxColumn. У меня также есть предварительно сгенерированный общий список (строка), который должен использоваться как DataSource для DataGridViewComboBox для каждой строки.DataGridViewComboBox DataSource

Наконец, у меня есть цикл, который перебирает набор строк и разбирает их соответствующим образом, с извлеченными значениями применяются к соответствующим клеткам при помощи устройств, как показано ниже:

dataGridView.Rows.Add("Column1Text", "Column2Text"); 

Элемент GridView данные заполнены, как ожидается, , а также DataGridViewComboBox, правильно отображающий идеальный элемент.

Проблема заключается в том, что DataGridViewComboBox, при нажатии, не выдает никаких элементов. Я проверил, что DataGridViewComboBox содержит элементы. Для параметра AutoSizeMode DataGridViewTextBoxColumn установлено значение «Заполнить», если оно имеет какое-либо значение.

Любое понимание того, что я могу делать неправильно? Нужно ли вручную выгружать элементы при нажатии данной ячейки? Благодарю.

Update

Я попробовал два разных метода с точки зрения связывания общий список в качестве источника данных.

Первое было связывание DataSource самой всей колонны через:

col_key.DataSource = KeyList; 

Второй способ связывание DataSource каждый новый DataGridViewComboBoxCell в соответствующей строке:

(DataGridViewComboBoxCell)(row.Cells[1]).DataSource = KeyList; 

Оба эти методы компилируют и правильно добавляют необходимые элементы во время выполнения, но ни один элемент не выпадает при нажатии.

+0

Вы тоже можете показать привязку? как-то кажется неправильным, добавить что-нибудь еще, кроме DataGridViewRow, в .Rows – mindandmedia

+0

Не могли бы вы добавить скриншот сетки, когда выбран столбец combobox? –

+0

Можете ли вы показать, как вы заполняете ComboBox из предварительно сгенерированного списка? Я не думаю, что я не знаком с этой техникой. –

ответ

0

Чтобы заполнить сетку combocolumn, вы должны относиться к нему как обычный Combo, источник данных для комбо должен иметь ValueMember и DisplayMember, поэтому проверьте следующий пример:

//Coded by Amen Ayach's DataClassBuilder @26/02/2012 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

public class iddesc{ 

    private int _id; 
    public int id{ 
     get { 
      return _id; 
     } 
     set { 
      _id = value; 
     } 
    } 

    private string _description; 
    public string description{ 
     get { 
      return _description; 
     } 
     set { 
      _description = value; 
     } 
    } 

} 

Чтобы заполнить сетку:

private void FillData() 
    { 
     List<iddesc> DataList = new List<iddesc>(); 
     for (int i = 1; i < 11; i++) 
     { 
      DataList.Add(new iddesc() { id = i, description = "Desc" + i.ToString() }); 
     } 
     ComboCol.ValueMember = "id"; 
     ComboCol.DisplayMember = "description"; 
     ComboCol.DataSource = DataList; 

     for (int i = 0; i < 10; i++) 
     { 
      grd.Rows.Add(); 
      grd[ComboCol.Name, i].Value = DataList[i].id;//Here you deliver the valuemember 
      grd[Column1.Name, i].Value = DataList[i].description; 
     } 
    } 
+0

Просто попробовал этот фрагмент (меняя имена там, где это необходимо), и у меня есть некоторые проблемы. Содержимое загружается, но когда я нажимаю Combobox, ничего не происходит. Он отлично работает со стандартным WinForms ComboBox. – user

+0

@NateShoffner, я думаю, что это просто: 'ComboCol.ReadOnly = false;' –

+0

Установка свойства ReadOnly в true или false не имеет никакого значения. – user

1

я решил справиться с этим в случае CellEnter:

private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e) 
    { 
     if (e.ColumnIndex == 2) 
     { 
      DataGridViewComboBoxCell cell = this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex] as DataGridViewComboBoxCell; 
      if (cell.DataSource == null) 
      { 
       cell.DataSource = this._ComboItemsBindingSource; 
       cell.DisplayMember = "Value"; //lite-weight wrapper on string 
       cell.ValueMember = "Value"; //where Value is a property 
      } 
     } 
    } 
0

у меня был подобный р РОБЛЕМА. Я обнаружил, что настройка свойства EditMode для DGV в EditOnEnter (ранее это было EditProgrammatically) устранила проблему. Это можно сделать в дизайнере.

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