2013-11-02 37 views
0

我加一個ComboBox我的DataGridView如何從我的DataGridView中獲取每個組合框的所有值並將它們添加到DataTable?

DBAccess dba = new DBAccess(); 
DataTable dt = dba.spGetASTMTable(); // Getting Data from DataBase for Grid 
DataTable dtOrders = dba.spGetOrdersList();/Getting Data from DataBase for ComboBox 
// Create ComboBox 
var cboDbTableColumn = new DataGridViewComboBoxColumn(); 
cboDbTableColumn.DataSource = dtOrders; 
cboDbTableColumn.DataPropertyName = "OrdersID"; 
cboDbTableColumn.DisplayMember = "Orders"; 
cboDbTableColumn.HeaderText = "DbTableColumn"; 

gvASTMOrderMessage.Columns.Add(cboDbTableColumn); 

gvASTMOrderMessage.DataSource = dt; 

然後我跑我的應用程序和變化的情侶組合框。 我點擊按鈕「保存」,我想獲得所有DataGridView數據的DataTable。據我所知,由於我的ComboBox是DataSource的一部分,我需要遍歷整個Grid並手動將ComboBox的值添加到我的DataTable中。我試圖在這裏執行此步驟:

private void btnSave_Click(object sender, EventArgs e) 
{ 
    DataTable data = (DataTable)(gvASTMOrderMessage.DataSource); 
    data.Columns.Add("DbTableColumn"); 
    for (int i = 0; i < gvASTMOrderMessage.Rows.Count; i++) 
    { 
     data.Rows[i]["DbTableColumn"] = Convert.ToString((gvASTMOrderMessage.Rows[i].Cells[0] as DataGridViewComboBoxCell).FormattedValue.ToString()); 
    } 
} 

但這不起作用。我一直試圖讓

gvASTMOrderMessage.Rows[i].Cells[0].FormattedValue.ToString() 
gvASTMOrderMessage.Rows[i].Cells[0].Value.ToString() 
gvASTMOrderMessage.Rows[i].Cells[0].EditedFormattedValue.ToString() 

但沒有這個工程...

請幫助,如何從我的DataGridView讓每一個組合框的所有值,並將其添加到數據表?

+0

爲什麼不在數據源dt DataTable中添加「DbTableColumn」? –

+1

@xeondev DbTableColumn是DataGridViewComboBoxColumn類型。如果你可以將它添加到數據源中(通過使用我提出的某種「技巧」),DataGridView無論如何都不會顯示正確的信息。您必須將這些特殊列類型「手動」添加到DataGridView。 – varocarbas

回答

1

DataSourceDataGridView是以某種方式協調的兩個不同對象。但是這種協調並不完美,實際上可以很容易地解決問題(從DataSource刪除元素並從DataGridView訪問這些索引)。這就是爲什麼,我總是喜歡同時影響兩個對象(DataSourceDataGridView)。

在任何情況下,請記住,您在DataGridView(例如添加/刪除列)中執行的相當多的更改不會自動反映在DataSource(儘管可能會相反)。在你的具體情況下,這種行爲更有意義,因爲將DataGridViewComboBoxColumn類型列自動包含到DataSource(可能是DataTable,也許是其他對象)實際上是不可能的(很多替代方法,沒有人比其他方法客觀地更好) 。

您應該想出一種方法來將組合框放入您的DataTable(例如:在給定列中填充許多行作爲組合框中的項目,並以某種方式「標記」此列)並執行代碼執行需要時進行相應的更新操作。

+0

是的,這是有道理的......我認爲這應該是一個更簡單的方法。好的... – Bryuk

+0

@Bryuk更快,短碼的方式有不少。但足夠準確的方式不是那麼多。 DataGridView是一個複雜的控件,它可以提供出色的結果,但需要「小心」處理,否則可能會出現錯誤。 – varocarbas

0

那麼,你應該檢查

DataTable data = (DataTable)(gvASTMOrderMessage.DataSource); 

檢查,如果數據表爲空(我是)。的代碼的其餘部分似乎正常,也 檢查

data.Rows [I] [ 「DbTableColumn」] = Convert.ToString((gvASTMOrderMessage.Rows [I] .Cells [0]爲的DataGridViewComboBoxCell).FormattedValue的ToString()); }

我會做類似

DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells[0]; 
       data.Rows[i]["DbTableColumn"] = cell.FormattedValue.ToString()); 

這是一個更可讀的版本。

希望這會有所幫助!

0

也許我不明白,但看下面的代碼: 我已經添加了額外的「ComboID」列,並且在gridview中選擇了項並點擊了「Save」按鈕後,數據表將包含ID從組合。

private void Form1_Load(object sender, EventArgs e) 
    { 
     var dt = new DataTable(); 
     dt.Columns.Add("Id"); 
     dt.Columns.Add("Value"); 
     dt.Columns.Add("ComboID"); 

     var drow = dt.NewRow(); 
     drow[0] = 10; 
     drow[1] = "abc"; 
     dt.Rows.Add(drow); 

     drow = dt.NewRow(); 
     drow[0] = 20; 
     drow[1] = "xy"; 
     dt.Rows.Add(drow); 

     dataGridView1.AutoGenerateColumns = false; 
     dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Id" }); 
     dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Value" }); 

     var dtOrders = new DataTable(); 
     dtOrders.Columns.Add("OrdersID"); 
     dtOrders.Columns.Add("Orders"); 

     drow = dtOrders.NewRow(); 
     drow[0] = 1; 
     drow[1] = "Order1"; 
     dtOrders.Rows.Add(drow); 

     drow = dtOrders.NewRow(); 
     drow[0] = 2; 
     drow[1] = "Order2"; 
     dtOrders.Rows.Add(drow); 

     var combo = new DataGridViewComboBoxColumn(); 
     combo.DataSource = dtOrders; 
     combo.DataPropertyName = "ComboID"; 
     combo.ValueMember = "OrdersID"; 
     combo.DisplayMember = "Orders"; 
     dataGridView1.Columns.Add(combo); 

     dataGridView1.DataSource = dt; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     var dt = dataGridView1.DataSource as DataTable; 
    } 
相關問題