2013-04-15 91 views
0

如果我將DataGridView(dgv)綁定到適配器,則dgv會自動填充表中的內容。不過,現在以文本形式呈現的其中一列,我想將其更改爲ComboBox。帶適配器和組合框的DataGridView

此代碼準備數據適配器:

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"]; 

相反添加這個額外的列我希望類別列改變,看起來像額外的公司lumn

enter image description here

回答

1

如果您使用設計器添加數據網格視圖,並選擇它,你會看到一個小箭頭的一些性質。您通常使用此方法將datagridview綁定到綁定源。您也可以使用箭頭「編輯列」。對於每一個可以選擇是否必須顯示或不顯示數據的順序和方式(作爲文本?作爲組合框?作爲數字?)。

因此,如果您已經設法添加適合您需求的組合框列,您只需轉到「編輯列」,選擇您不想看到的列並將它們從列表中刪除datagridview中的列,或使用該列的屬性使其不可見。

通常情況下,您不會添加額外的列,而是更改屬性,以便顯示組合框而不是文本。

+0

我不使用設計師。是否有可能在mySQL中使用設計器? –

0

看來答案是添加行colCategory.DataPropertyName = "Category"。在調用spendingsAdapter.Fill(..)之前添加此行,因爲它確認列已經存在並且沒有創建新行。