2010-08-09 47 views
0

假設我有一個運行存儲過程的表單。 此存儲過程使用預生成的值在表中創建一些行,並返回包含由此存儲過程創建的行的DataTable。將DataTable的內容傳播到3 DataGridViews

在窗體上,我需要在3個不同的DataGridView上顯示此信息,以便用戶可以更改它。 模式是相同的,但每個DataGridViews都會顯示不同的類別,因此會在每個DataGridView中隱藏一些不相關的列,但在數據庫中它們都是同一個表的一部分。 用戶可以在所有3個DataGridView上添加新行。

我有點困惑如何將來自單個DataTable的信息顯示爲三個不同的DataGridView,並且仍然有一個簡單的方法來更新用戶對DataGridViews所做更改的數據庫。

我假設我可以在其中三個主要DataTable中斷,然後將每個DataTable綁定到相關的DataGridView,但是當我想要將更改(更新和新行)保存到數據庫考慮到我的更改分散到3個DataTable中而不是單個數據表中?

有沒有更好的方法來實現這一點,而不是主要的DataTable分裂?

非常感謝。

回答

2

所有的DataGridView都需要自己的DataView。最簡單的方法可能是使用單獨的BindingSource組件。

當你說出:

dataGridView1.DataSource = dataTable1; 

您在實際使用表的默認數據視圖。你正在尋找類似的東西:

//untested 
var view1 = new DataView(dataTable1); 
dataGridView1.DataSource = view1; 
var view2 = new DataView(dataTable1); 
dataGridView2.DataSource = view2; 

然後你可以使用view1,view2來控制過濾和排序。

+0

謝謝,請你再擴展一下嗎? – 2010-08-09 09:09:52

1

非常感謝Henk,您的文章讓我走上了正確的軌道,它完美地解決了我的問題。 我現在可以在任何網格視圖中添加項目,並且我的DataTable已更新,無需執行像我期望的那樣可以完成的任何操作。

爲了嘗試理解解決方案,我做了一個小測試演示,我想我會在這裏發佈給未來的讀者,因爲它包括如何過濾每個DataView以僅包含相關信息。 這是一個示例代碼,我沒有包括錯誤檢查等。

private DataTable fruitsDataTable = null; 
private DataView orangesDataView = null; 
private DataView applesDataView = null; 

private void Form1_Load(object sender, EventArgs e) 
    { 
     fruitsDataTable = new DataTable("Fruits"); 

     // Dynamically create the DataTable schema for the sake of this example 
     fruitsDataTable.Columns.Add("Category", typeof(string)); 
     fruitsDataTable.Columns.Add("Description", typeof (string)); 
     fruitsDataTable.Columns.Add("Quantity", typeof(int)); 
     fruitsDataTable.Columns.Add("Price", typeof(double)); 

     // Add the fruits to the main table 
     fruitsDataTable.Rows.Add("ORANGE", "Fresh Oranges", 5, 5.50); 

     fruitsDataTable.Rows.Add("APPLE", "Granny Smith Apples", 10, 2.20); 
     fruitsDataTable.Rows.Add("APPLE", "Golden Apples", 40, 1.75); 

     fruitsDataTable.Rows.Add("ORANGE", "Bloody Oranges", 10, 7.99); 

     fruitsDataTable.Rows.Add("BANANA", "Ivory Coast Bananas", 5, 6.99); 

     mainGridView.DataSource = fruitsDataTable; 

     // Create a DataView for each fruit category and bind it to the relevant DataGridView control on the form 
     orangesDataView = new DataView(fruitsDataTable, "Category = 'ORANGE'", string.Empty, DataViewRowState.CurrentRows); 
     orangesGridView.DataSource = orangesDataView; 

     applesDataView = new DataView(fruitsDataTable, "Category = 'APPLE'", string.Empty, DataViewRowState.CurrentRows); 
     applesGridView.DataSource = applesDataView; 
    }