在很多單據的設計當中,常常會有加總的一些應用。比如,在訂單主檔中,會有一個欄位TotalAmt,用於存放訂單明細檔的總金額。這樣的設計對訂單金額的處理比較方便靈活,尤其是處理訂單金額的統計或資料的分析時,將可以帶來較佳的效能與更容易取得加總值等。以下就是針對DataGridView加總的設計方式說明。

 

Step1了能實現訂單主檔有一個加總欄位,我們在Northwind資料庫的Orders資料表中增加一個欄位TotalAmount,用於存放Detail表的總金額。增加欄位的SQL語句如下:
Alter Table Orders Add TotalAmount decimal(18,4)


5-1-1 增加TotalAmount欄位語句

我們使用之前的C002來設計加總的功能,打開C002Form1。因為Detail檔中沒有金額的欄位,所以先加上一個計算欄位來顯示金額,以利將其加總值加到Master檔中。

Step2右鍵點擊DetailInfoDataGridView,選擇Edit Columns

Œ  增加一個欄位命名為AmountName 設定為 Amount將其ColumnType屬性設置為InfoDataGridView ExpressionColumn】(代表為GridView中的計算式欄位HederText設為金額

  這時會出現另外兩個屬性,其中Expression為該計算欄位的計算方式,這裏我們設置為UnitPrice*Quantity】,代表將單價與數量相乘,另一個為EffectColumnNames屬性,為影響的欄位有那些,在此我們設為UnitPrice;Quantity(欄位名稱間用隔開),代表當User輸入UnitPriceQuantity的值有變動時,則本計算欄位的值也會隨之動態改變,若是沒設定EffectColumnNames,就必須當User離開此筆資料時,才會反應該計算值。

5-1-2/1 進入編輯欄位視窗

 

5-1-2/2 增加設定Amount欄位

5-1-2/3 增加設定Amount欄位

 

其實EffectColumnNames可以不必設定,不會影響到計算式的結果,如果是為了在輸入EffectColumnNames所指定的欄位時,能立即反應計算式的結果,就需要設定此項目。

 

Step3grdOrderDetailsDetail對於的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明細檔中,看到其加總值,並且可以在UnitPriceQuantity中更改數值,你會發現後面的「金額」欄位將會立即改變,加總值也會立即更新。

F   UnitPriceQuantity更改前:

5-1-5/1 UnitPriceQuantity更改前

 

F   UnitPriceQuantity更改後:

5-1-5/2 UnitPriceQuantity更改後

 

Step6為了能展現更好的效果,我們現在要將Detail明細檔的加總加到Master主檔的某一個欄位中。我們先在MasterDouble Click,並將在第一個步驟產生的TotalAmount欄位拖拉到畫面上。

注:如果找不到這個欄位,應先將Master重新Active,如果還沒有,需要檢查一下Server端的對應InfoCommandSql語法是否有加該欄位,如果是Select * from Orders就應該沒有問題。

5-1-6 Detail明細檔的加總加到Master主檔

 

Step7接著我們要寫程式來讓加總值自動更新到MasterTotalAmount欄位中。只需在DetailInfoDataGridViewTotalValueChanged事件中做相關處理,先把焦點放在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(); //對應TotalAmountInfoTextBox的名字

             //假設InfoTextox02TotalAmount欄位

            }

        }

 

Step8編譯C002並執行。同樣可以去更改Detail明細檔中的UnitPriceQuantity欄位,此時MasterTotalAmount會同步更新,並且在你對Master存檔時,TotalAmount會一併被存回。

F   UnitPriceQuantity 更改前:

5-1-8/1 UnitPriceQuantity 更改前

F   UnitPriceQuantity 更改後:

5-1-8/2 UnitPriceQuantity 更改後

 


Converted from CHM to HTML with chm2web Pro 2.85 (unicode)