2013-10-16 51 views
4

我有一個datagridview從SQL服務器獲取數據填充。Databinding DatagridviewCombobox列與枚舉

gridview.Datasource = dataSet.Tables[0] 

- >沒問題。

在這個網格中,一列是ComboboxColumn ...

爲餡(我的意思是,到數據源綁定唯一)這一個,沒有問題:

cmb.DataSource = Enum.GetValues(typeof(MyEnum)); 
cmb.ValueType = typeof(MyEnum); 
cmb.DataPropertyName = "MyEnum"; 

我想知道如何將數據綁定到datagridviewcombobox列(此列的DB值是此組合框的選定值的索引,並且此組合框的數據源是Enum)。

價值DB:2 - >爲項的索引,以顯示

i可以精確的DB列名某處哪個?如果我這樣做在datapropertyname我得到一個錯誤 - > DataGridViewComboboxCell值是無效的...

在此先感謝!

編輯:問題「解決」。我用一個數據表替換了Enum。簡單得多。

+0

你到底需要什麼?你的DataGrid綁定到一個表,並添加未綁定組合框列映射到enum.After呢?你需要什麼,例如組合框中選定的項目映射到其中一列中的某個值? – terrybozzio

+0

我有一個綁定到數據集的網格。 –

+0

是的,你是正確的。通過知道網格已經綁定到數據集...我只需要知道如何綁定datagridviewcomboboxcolumn(DB中的值是組合框的索引,而組合框的數據源是枚舉)。 –

回答

2

正如評論指出上述,我您呈現以下選項:

這是作爲一個例子,你可以細粒度這個你認爲合適的,所以首先你之前設置的gridview的數據源中添加綁定comboboxColumn給它一個名稱,然後設置數據源,然後設置datagridview的數據源和訂閱例如用於CellEndEdit和RowStateChanged事件是這樣的:所以每次

DataGridViewComboBoxColumn col = new DataGridViewComboBoxColumn(); 
col.DataSource = Enum.GetValues(typeof(MyEnum)); 
col.Name = "testcolumn"; 

int index = dataGridView1.Columns.Add(col); 
//"index" is if you want to set properties and so on to this column 
//but no need for this example. 
//dataGridView1.Columns[index].Name = "testcolumn"; 

dataGridView1.DataSource = test; 

//the 2 event-handlers   
dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit); 
dataGridView1.RowStateChanged += new DataGridViewRowStateChangedEventHandler(dataGridView1_RowStateChanged); 

內。然後這2個處理器做到這一點(的CellEndEdit的處理你編輯包含來自數據庫的值的單元格,組合框也更新);

void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
     //here i use TestCol as a name for the column i want to check 
     //you replace it with the column you have from the database 
     //if you didnt change it of course... 
     if (e.ColumnIndex == dataGridView1.Columns["TestCol"].Index) 
     { 
      //and here i assign the value on the current row in the testcolumn column 
      //thats the combobox column... 
      dataGridView1.Rows[e.RowIndex].Cells["testcolumn"].Value = (MyEnum)((int)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value); 
     } 
} 

private void dataGridView1_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) 
{ 
     //here i assign the initial values to the each cell in the combobox column 
     //this whole example could be done in other ways but in a nutshell 
     //it should provide you a good kickstart to play around. 
     if (e.Row.DataBoundItem != null) 
     { 
      e.Row.Cells["testcolumn"].Value = (MyEnum)((int)e.Row.Cells["TestCol"].Value); 
     } 
} 

我這裏假設從數據庫中列有像0或2或5只輸入數值,和你的枚舉必須具有示例值相同數量的,如果在數據庫中列的值上升到最大的5那麼你的枚舉會是這樣,例如:

public enum MyEnum 
{ 
    zero, 
    one, 
    two, 
    three, 
    four, 
    five 
}