2014-10-20 3 views
0

У меня есть две следующих таблицы:Как заполнять DataGridView из двух таблиц с ComboBox

| Part_id | Name |Part_Type| 
|----------|---------|---------| 
| 1  | ABC | Nut | 
| 2  | DEF | Nut | 
| 3  | GHI | Washer | 

| Type | 
|----------| 
| Nut | 
| Screw | 
| Washer | 

Как я могу заполнить DataGridView так:

| Part_id | Name |  Part_Type  | 
|----------|---------|-------------------| 
| 1  | ABC | Nut(combobox) | 
| 2  | DEF | Nut(combobox) | 
| 3  | GHI | Washer(combobox) | 

с выпадающим списком с каждым типом на Part_Type, чтобы пользователь мог изменить тип определенной части?

Это то, что у меня есть:

string myCmdText = "SELECT * FROM Parts"; 
MySqlCommand myQuery = new MySqlCommand(myCmdText, myConnection); 
using (MySqlDataAdapter myAdapter = new MySqlDataAdapter(myQuery)) 
{ 
    DataSet DS = new DataSet(); 
    myAdapter.Fill(DS); 
    myDataGridView.DataSource = DS.Tables[0]; 
} 

Я пытался отливать Part_Type поля клетки DataGridView в ComboBoxCells и добавление недостающих типов деталей вручную, но я получаю InvalidCastException.

Есть ли способ сделать это, желательно легче, чем тот, который я пробовал?

ответ

0

Чтобы использовать тип выпадающий ячейки вам нужно сделать две вещи:

  • Создание ячеек типа DataGridViewComboBoxCell
  • Заполните их с соответствующими данными

Создание падают вниз клетки:

Вы должны либо создать все Columns как типы, которые вы хотите, чтобы они были в co de, вместо использования автоматической генерации столбцов. Set myDataGridView.AutoGenerateColumns = false; Это должно быть сделано до, выдавая запрос, так как позже вы не можете изменить тип столбца.

Но есть обходной путь : Для дальнейшего изменения типа вы должны обменять каждыйCell вы хотите быть особенными, против ячейки типа вы хотите. Примечание: это касается ячеек, а не столбцов, поэтому вам нужно пройти по всем строкам, как в коде ниже!

Заполнение их с соответствующими данными:

Вы можете а) использовать DataBinding:

  • Установите Datasource для ComboBoxCells, как правило, на запрос от 2 таблицы; но вы также можете установить их отборное отличие от первого результата запроса или какого-либо другого источника ..
  • Set DisplayMember & ValueMember (в вашем случае в ту же область.)

Или вы б) могли бы заполнить коллекция Items с несвязанными данными.

Вы можете использовать что-то вроде этого:

string myCmdText = "SELECT * FROM Parts"; 
string myCmdText2 = "SELECT * FROM Types"; 
int yourDropdownIndex = 2; 
MySqlCommand myQuery = new MySqlCommand(myCmdText, myConnection); 
MySqlCommand myQuery2 = new MySqlCommand(myCmdText2, myConnection); 
using (MySqlDataAdapter myAdapter = new MySqlDataAdapter(myQuery)) 
using (MySqlDataAdapter myAdapter2 = new MySqlDataAdapter(myQuery2)) 
{ 
    DataSet DS = new DataSet(); 
    DataTable DT2 = new DataTable(); 
    myAdapter.Fill(DS); 
    myAdapter2.Fill(DT2); 
    DS.Tables.Add(DT2); 
    myDataGridView.DataSource = DS.Tables[0]; 
    foreach (DataGridViewRow row in myDataGridView.Rows) 
    { 
     var temp = row.Cells[yourDropdownIndex].Value; 
     DataGridViewComboBoxCell comboCell = new DataGridViewComboBoxCell(); 
     comboCell.DisplayMember = "type"; 
     comboCell.ValueMember = "type"; 
     comboCell.DataSource = DS.Tables[1]; 
     row.Cells[yourDropdownIndex] = comboCell; 
     row.Cells[yourDropdownIndex].Value = temp; 
    } 
} 

При необходимости теперь можно бросить одного Cell к DataGridViewComboBoxCell:

int ddlCount = ((DataGridViewComboBoxCell) 
       myDataGridView.Rows[row].Cells[yourDropdownIndex]).Items.Count; 

Вы можете объявить DataSet DS на уровне класса ..

+0

Не так легко, как изменить типы столбцов, что невозможно, но не так сложно. См. Мои исправления и добавленный комментарий! - – TaW

+0

Спасибо! Это код, который мне пришлось написать, к сожалению, нет более простого способа его решения. Однако вы не должны бросать DataGridViewTextBoxCell в DataGridViewComboBoxCell, потому что это вызовет InvalidCastException, поэтому я удалю последний бит из ответа. –

+0

Вы можете и должны делать актерский состав, если (и только если) эта ячейка фактически является «DataGridViewComboBoxCell», иначе вы не сможете получить доступ к ее специальным свойствам, особенно к коллекции «Items». Поэтому, чтобы быть в безопасности, вы можете проверить перед литой: 'if (cell.EditType == typeof (DataGridViewComboBoxCell))' .. - Или использовать с 'as' и проверить на' null' .. – TaW