2013-04-15 2 views
0

Если я привязываю DataGridView (dgv) к адаптеру, dgv автоматически заполняется содержимым таблицы. Однако один из столбцов, который теперь представлен как текст, я хочу изменить его на ComboBox.DataGridView с адаптером и combobox

Этот код готовит адаптер данных:

MySqlDataAdapter awardsAdapter, spendingsAdapter; 
DataSet cachedData = new DataSet(); 
MySqlDataAdapter PrepareSpendingsAdapter() { 
try { 
     MySqlDataAdapter adapter; 
     adapter = new MySqlDataAdapter("select * from spendings", connection); 
     adapter.TableMappings.Add("Table", "spendings"); 

     adapter.UpdateCommand = new MySqlCommand(
      "UPDATE spendings SET [email protected], [email protected] WHERE [email protected];", 
      connection); 
     adapter.UpdateCommand.Parameters.Add("@id", MySqlDbType.Int32, 10, "ID");     
     adapter.UpdateCommand.Parameters.Add("@category", MySqlDbType.Int32, 10, "Category"); 
     adapter.UpdateCommand.Parameters.Add("@points", MySqlDbType.Int32, 10, "Points");     
     adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; 

     adapter.InsertCommand = new MySqlCommand(
      "INSERT INTO spendings VALUES (@id,@category,@points);", 
      connection); 
     adapter.InsertCommand.Parameters.Add("@id", MySqlDbType.Int32, 10, "ID"); 
     adapter.InsertCommand.Parameters.Add("@category", MySqlDbType.Int32, 10, "Category"); 
     adapter.InsertCommand.Parameters.Add("@points", MySqlDbType.Int32, 10, "Points"); 
     adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None; 

     adapter.DeleteCommand = new MySqlCommand(
      "DELETE FROM spendings WHERE [email protected];", connection); 
     adapter.DeleteCommand.Parameters.Add("@id", MySqlDbType.Int32, 10, "ID"); 
     adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; 

     return adapter; 
    } catch (Exception ex) { 
     MessageBox.Show(ex.Message); 
    } 
    return null; 
} 

Этот код добавляет дополнительный столбец с информацией мне нужно

DataGridViewComboBoxColumn cmb = new DataGridViewComboBoxColumn(); 
MySqlDataAdapter adapterSpendCategory = new MySqlDataAdapter("select category,details from spendcategory", connection); 
adapterSpendCategory.TableMappings.Add("Table", "spendcategory"); 
adapterSpendCategory.Fill(cachedData); 
cmb.DataSource = cachedData.Tables["spendcategory"]; 
cmb.DisplayMember = "details"; 
cmb.ValueMember = "category"; 
//Put the missing piece of the puzzle here 

Этот код заполнит DataGridView:

spendingsAdapter = PrepareSpendingsAdapter(); 
spendingsAdapter.Fill(cachedData); 
dgvPointsSpent.DataSource = cachedData.Tables["spendings"]; 

Вместо этого добавив этот дополнительный столбец, я хочу, чтобы столбец категории изменился и выглядел как дополнительный co lumn

enter image description here

ответ

1

Если вы используете конструктор, чтобы добавить вид сетки данных, и выберите его, вы увидите небольшую стрелку с некоторыми свойствами. Обычно вы используете это, чтобы привязать datagridview к источнику привязки. Вы также можете использовать стрелку для «редактирования столбцов». Для каждого coiumn вы можете выбрать, должно ли оно отображаться или нет, в каком порядке и как данные должны отображаться (как текст? Как поле со списком? Как число?).

Итак, если вам уже удалось добавить столбец со списком, который подходит вашим потребностям, все, что вам нужно сделать, это перейти к «редактированию столбцов», выбрать столбцы, которые вы не хотите видеть, и либо удалить их из списка столбцов в datagridview или использовать свойства этого столбца, чтобы сделать его невидимым.

Обычно вы не добавляли дополнительный столбец, но изменяли свойства, чтобы он отображал выпадающее поле вместо текста.

+0

Я не использую дизайнер. Можно ли использовать конструктор с mySQL? –

0

Кажется, ответ добавлял строку colCategory.DataPropertyName = "Category". Добавление этой строки перед вызовом spendingsAdapter.Fill(..) сделало трюк, поскольку он признал, что столбец уже существует и не создал новый.

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