在很多單據的設計當中,常常會有加總的一些應用。比如,在訂單主檔中,會有一個欄位TotalAmt,用於存放訂單明細檔的總金額。這樣的設計對訂單金額的處理比較方便靈活,尤其是處理訂單金額的統計或資料的分析時,將可以帶來較佳的效能與更容易取得加總值等。以下就是針對DataGridView加總的設計方式說明。
Step1>為了能實現訂單主檔有一個加總欄位,我們在Northwind資料庫的Orders資料表中增加一個欄位TotalAmount,用於存放Detail表的總金額。增加欄位的SQL語句如下:
Alter Table Orders Add TotalAmount
decimal(18,4)
圖 5-1-1 增加TotalAmount欄位語句
我們使用之前的C002來設計加總的功能,打開C002的Form1。因為Detail檔中沒有金額的欄位,所以先加上一個計算欄位來顯示金額,以利將其加總值加到Master檔中。
Step2>右鍵點擊Detail的InfoDataGridView,選擇【Edit Columns…】。
Œ 增加一個欄位命名為Amount(Name 設定為 Amount),將其『ColumnType』屬性設置為【InfoDataGridView ExpressionColumn】(代表為GridView中的計算式欄位);『HederText』設為【金額】;
這時會出現另外兩個屬性,其中Expression為該計算欄位的計算方式,這裏我們設置為【UnitPrice*Quantity】,代表將單價與數量相乘,另一個為『EffectColumnNames』屬性,為影響的欄位有那些,在此我們設為【UnitPrice;Quantity】(欄位名稱間用“;”隔開),代表當User輸入UnitPrice或Quantity的值有變動時,則本計算欄位的值也會隨之動態改變,若是沒設定EffectColumnNames,就必須當User離開此筆資料時,才會反應該計算值。
圖 5-1-2/1 進入編輯欄位視窗
圖 5-1-2/2 增加設定Amount欄位
圖 5-1-2/3 增加設定Amount欄位
其實EffectColumnNames可以不必設定,不會影響到計算式的結果,如果是為了在輸入EffectColumnNames所指定的欄位時,能立即反應計算式的結果,就需要設定此項目。
Step3>將grdOrderDetails(Detail對於的Grid)的『TotalActive』屬性設為【True】,再把 『TotalCaption』屬性設為【總計】,並在TotalColumns屬性中增加一個要做Total處理的欄位(可以增加多個)。
圖 5-1-3 開啟InfoDataGridView Total功能
Step4>這裏就增加剛剛設置的計算欄位Amount,設『ShowTotal』的屬性為【True】,代表要顯示出加總值;『TotalAlignment』屬性設為【Right】,
『TotalMode』屬性設為【sum】代表要對其進行加總處理。
圖 5-1-4 繼續對Amount欄位設置
Step5>接著我們重新對C002編譯,並重新執行C002的表單。如圖我們可以在Detail明細檔中,看到其加總值,並且可以在UnitPrice與Quantity中更改數值,你會發現後面的「金額」欄位將會立即改變,加總值也會立即更新。
F UnitPrice,Quantity更改前:
圖 5-1-5/1 UnitPrice,Quantity更改前
F UnitPrice,Quantity更改後:
圖 5-1-5/2 UnitPrice,Quantity更改後
Step6>為了能展現更好的效果,我們現在要將Detail明細檔的加總加到Master主檔的某一個欄位中。我們先在Master作Double Click,並將在第一個步驟產生的『TotalAmount』欄位拖拉到畫面上。
注:如果找不到這個欄位,應先將Master重新Active,如果還沒有,需要檢查一下Server端的對應InfoCommand的Sql語法是否有加該欄位,如果是Select * from Orders就應該沒有問題。
圖 5-1-6 將Detail明細檔的加總加到Master主檔
Step7>接著我們要寫程式來讓加總值自動更新到Master的TotalAmount欄位中。只需在Detail的InfoDataGridView的TotalValueChanged事件中做相關處理,先把焦點放在grdOrderDetails,按下,再連點兩下TotalChanged項目,新增的程式如下:
圖 5-1-7 添加加總事件
private void infoDataGridView1_TotalChanged(object sender, TotalChangedEventArgs e)
{ //取得主檔Master的操作狀態,只有在新增或修改的狀態下,才要將總金額設給Master
string stat = infoNavigator1.GetCurrentState();
if (stat == "Inserting" || stat == "Editing")
{ InfoTextBox02.Text = e.TotalValue.ToString(); //對應TotalAmount的InfoTextBox的名字
//假設InfoTextox02為TotalAmount欄位
}
}
Step8>編譯C002並執行。同樣可以去更改Detail明細檔中的UnitPrice與Quantity欄位,此時Master的TotalAmount會同步更新,並且在你對Master存檔時,TotalAmount會一併被存回。
F UnitPrice,Quantity 更改前:
圖 5-1-8/1 UnitPrice,Quantity 更改前
F UnitPrice,Quantity 更改後:
圖 5-1-8/2 UnitPrice,Quantity 更改後
Converted from CHM to HTML with chm2web Pro 2.85 (unicode) |